diff options
| author | 2023-03-15 01:39:11 -0600 | |
|---|---|---|
| committer | 2023-03-15 17:01:05 -0600 | |
| commit | 5031f5b8b07dcabf727cf5530f2e00c396de7ea0 (patch) | |
| tree | bd52aef22b9f4675b75676ef4f1bf50419c997ce /src/core/hle/service/mii | |
| parent | service: nfp: Actually write correct crc (diff) | |
| download | yuzu-5031f5b8b07dcabf727cf5530f2e00c396de7ea0.tar.gz yuzu-5031f5b8b07dcabf727cf5530f2e00c396de7ea0.tar.xz yuzu-5031f5b8b07dcabf727cf5530f2e00c396de7ea0.zip | |
service: nfp: Convert mii colors to v3
Diffstat (limited to 'src/core/hle/service/mii')
| -rw-r--r-- | src/core/hle/service/mii/mii_manager.cpp | 33 | ||||
| -rw-r--r-- | src/core/hle/service/mii/mii_manager.h | 7 | ||||
| -rw-r--r-- | src/core/hle/service/mii/types.h | 57 |
3 files changed, 87 insertions, 10 deletions
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp index 9d31a080c..c920650f5 100644 --- a/src/core/hle/service/mii/mii_manager.cpp +++ b/src/core/hle/service/mii/mii_manager.cpp | |||
| @@ -510,7 +510,7 @@ CharInfo MiiManager::ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const { | |||
| 510 | return mii; | 510 | return mii; |
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | 513 | Ver3StoreData MiiManager::BuildFromStoreData(const CharInfo& mii) const { |
| 514 | Service::Mii::MiiManager manager; | 514 | Service::Mii::MiiManager manager; |
| 515 | Ver3StoreData mii_v3{}; | 515 | Ver3StoreData mii_v3{}; |
| 516 | 516 | ||
| @@ -534,16 +534,13 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 534 | mii_v3.region_information.character_set.Assign(mii.font_region); | 534 | mii_v3.region_information.character_set.Assign(mii.font_region); |
| 535 | 535 | ||
| 536 | mii_v3.appearance_bits1.face_shape.Assign(mii.faceline_type); | 536 | mii_v3.appearance_bits1.face_shape.Assign(mii.faceline_type); |
| 537 | mii_v3.appearance_bits1.skin_color.Assign(mii.faceline_color); | ||
| 538 | mii_v3.appearance_bits2.wrinkles.Assign(mii.faceline_wrinkle); | 537 | mii_v3.appearance_bits2.wrinkles.Assign(mii.faceline_wrinkle); |
| 539 | mii_v3.appearance_bits2.makeup.Assign(mii.faceline_make); | 538 | mii_v3.appearance_bits2.makeup.Assign(mii.faceline_make); |
| 540 | 539 | ||
| 541 | mii_v3.hair_style = mii.hair_type; | 540 | mii_v3.hair_style = mii.hair_type; |
| 542 | mii_v3.appearance_bits3.hair_color.Assign(mii.hair_color); | ||
| 543 | mii_v3.appearance_bits3.flip_hair.Assign(mii.hair_flip); | 541 | mii_v3.appearance_bits3.flip_hair.Assign(mii.hair_flip); |
| 544 | 542 | ||
| 545 | mii_v3.appearance_bits4.eye_type.Assign(mii.eye_type); | 543 | mii_v3.appearance_bits4.eye_type.Assign(mii.eye_type); |
| 546 | mii_v3.appearance_bits4.eye_color.Assign(mii.eye_color); | ||
| 547 | mii_v3.appearance_bits4.eye_scale.Assign(mii.eye_scale); | 544 | mii_v3.appearance_bits4.eye_scale.Assign(mii.eye_scale); |
| 548 | mii_v3.appearance_bits4.eye_vertical_stretch.Assign(mii.eye_aspect); | 545 | mii_v3.appearance_bits4.eye_vertical_stretch.Assign(mii.eye_aspect); |
| 549 | mii_v3.appearance_bits4.eye_rotation.Assign(mii.eye_rotate); | 546 | mii_v3.appearance_bits4.eye_rotation.Assign(mii.eye_rotate); |
| @@ -551,7 +548,6 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 551 | mii_v3.appearance_bits4.eye_y_position.Assign(mii.eye_y); | 548 | mii_v3.appearance_bits4.eye_y_position.Assign(mii.eye_y); |
| 552 | 549 | ||
| 553 | mii_v3.appearance_bits5.eyebrow_style.Assign(mii.eyebrow_type); | 550 | mii_v3.appearance_bits5.eyebrow_style.Assign(mii.eyebrow_type); |
| 554 | mii_v3.appearance_bits5.eyebrow_color.Assign(mii.eyebrow_color); | ||
| 555 | mii_v3.appearance_bits5.eyebrow_scale.Assign(mii.eyebrow_scale); | 551 | mii_v3.appearance_bits5.eyebrow_scale.Assign(mii.eyebrow_scale); |
| 556 | mii_v3.appearance_bits5.eyebrow_yscale.Assign(mii.eyebrow_aspect); | 552 | mii_v3.appearance_bits5.eyebrow_yscale.Assign(mii.eyebrow_aspect); |
| 557 | mii_v3.appearance_bits5.eyebrow_rotation.Assign(mii.eyebrow_rotate); | 553 | mii_v3.appearance_bits5.eyebrow_rotation.Assign(mii.eyebrow_rotate); |
| @@ -563,7 +559,6 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 563 | mii_v3.appearance_bits6.nose_y_position.Assign(mii.nose_y); | 559 | mii_v3.appearance_bits6.nose_y_position.Assign(mii.nose_y); |
| 564 | 560 | ||
| 565 | mii_v3.appearance_bits7.mouth_type.Assign(mii.mouth_type); | 561 | mii_v3.appearance_bits7.mouth_type.Assign(mii.mouth_type); |
| 566 | mii_v3.appearance_bits7.mouth_color.Assign(mii.mouth_color); | ||
| 567 | mii_v3.appearance_bits7.mouth_scale.Assign(mii.mouth_scale); | 562 | mii_v3.appearance_bits7.mouth_scale.Assign(mii.mouth_scale); |
| 568 | mii_v3.appearance_bits7.mouth_horizontal_stretch.Assign(mii.mouth_aspect); | 563 | mii_v3.appearance_bits7.mouth_horizontal_stretch.Assign(mii.mouth_aspect); |
| 569 | mii_v3.appearance_bits8.mouth_y_position.Assign(mii.mouth_y); | 564 | mii_v3.appearance_bits8.mouth_y_position.Assign(mii.mouth_y); |
| @@ -573,10 +568,7 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 573 | mii_v3.appearance_bits9.mustache_y_position.Assign(mii.mustache_y); | 568 | mii_v3.appearance_bits9.mustache_y_position.Assign(mii.mustache_y); |
| 574 | 569 | ||
| 575 | mii_v3.appearance_bits9.bear_type.Assign(mii.beard_type); | 570 | mii_v3.appearance_bits9.bear_type.Assign(mii.beard_type); |
| 576 | mii_v3.appearance_bits9.facial_hair_color.Assign(mii.beard_color); | ||
| 577 | 571 | ||
| 578 | mii_v3.appearance_bits10.glasses_type.Assign(mii.glasses_type); | ||
| 579 | mii_v3.appearance_bits10.glasses_color.Assign(mii.glasses_color); | ||
| 580 | mii_v3.appearance_bits10.glasses_scale.Assign(mii.glasses_scale); | 572 | mii_v3.appearance_bits10.glasses_scale.Assign(mii.glasses_scale); |
| 581 | mii_v3.appearance_bits10.glasses_y_position.Assign(mii.glasses_y); | 573 | mii_v3.appearance_bits10.glasses_y_position.Assign(mii.glasses_y); |
| 582 | 574 | ||
| @@ -585,6 +577,16 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 585 | mii_v3.appearance_bits11.mole_x_position.Assign(mii.mole_x); | 577 | mii_v3.appearance_bits11.mole_x_position.Assign(mii.mole_x); |
| 586 | mii_v3.appearance_bits11.mole_y_position.Assign(mii.mole_y); | 578 | mii_v3.appearance_bits11.mole_y_position.Assign(mii.mole_y); |
| 587 | 579 | ||
| 580 | // These types are converted to V3 from a table | ||
| 581 | mii_v3.appearance_bits1.skin_color.Assign(Ver3FacelineColorTable[mii.faceline_color]); | ||
| 582 | mii_v3.appearance_bits3.hair_color.Assign(Ver3HairColorTable[mii.hair_color]); | ||
| 583 | mii_v3.appearance_bits4.eye_color.Assign(Ver3EyeColorTable[mii.eye_color]); | ||
| 584 | mii_v3.appearance_bits5.eyebrow_color.Assign(Ver3HairColorTable[mii.eyebrow_color]); | ||
| 585 | mii_v3.appearance_bits7.mouth_color.Assign(Ver3MouthlineColorTable[mii.mouth_color]); | ||
| 586 | mii_v3.appearance_bits9.facial_hair_color.Assign(Ver3HairColorTable[mii.beard_color]); | ||
| 587 | mii_v3.appearance_bits10.glasses_color.Assign(Ver3GlassColorTable[mii.glasses_color]); | ||
| 588 | mii_v3.appearance_bits10.glasses_type.Assign(Ver3GlassTypeTable[mii.glasses_type]); | ||
| 589 | |||
| 588 | mii_v3.crc = GenerateCrc16(&mii_v3, sizeof(Ver3StoreData) - sizeof(u16)); | 590 | mii_v3.crc = GenerateCrc16(&mii_v3, sizeof(Ver3StoreData) - sizeof(u16)); |
| 589 | 591 | ||
| 590 | // TODO: Validate mii_v3 data | 592 | // TODO: Validate mii_v3 data |
| @@ -592,6 +594,19 @@ Ver3StoreData MiiManager::ConvertCharInfoToV3(const CharInfo& mii) const { | |||
| 592 | return mii_v3; | 594 | return mii_v3; |
| 593 | } | 595 | } |
| 594 | 596 | ||
| 597 | NfpStoreDataExtension MiiManager::SetFromStoreData(const CharInfo& mii) const { | ||
| 598 | return { | ||
| 599 | .faceline_color = static_cast<u8>(mii.faceline_color & 0xf), | ||
| 600 | .hair_color = static_cast<u8>(mii.hair_color & 0x7f), | ||
| 601 | .eye_color = static_cast<u8>(mii.eyebrow_color & 0x7f), | ||
| 602 | .eyebrow_color = static_cast<u8>(mii.eyebrow_color & 0x7f), | ||
| 603 | .mouth_color = static_cast<u8>(mii.mouth_color & 0x7f), | ||
| 604 | .beard_color = static_cast<u8>(mii.beard_color & 0x7f), | ||
| 605 | .glass_color = static_cast<u8>(mii.glasses_color & 0x7f), | ||
| 606 | .glass_type = static_cast<u8>(mii.glasses_type & 0x1f), | ||
| 607 | }; | ||
| 608 | } | ||
| 609 | |||
| 595 | bool MiiManager::ValidateV3Info(const Ver3StoreData& mii_v3) const { | 610 | bool MiiManager::ValidateV3Info(const Ver3StoreData& mii_v3) const { |
| 596 | bool is_valid = mii_v3.version == 0 || mii_v3.version == 3; | 611 | bool is_valid = mii_v3.version == 0 || mii_v3.version == 3; |
| 597 | 612 | ||
diff --git a/src/core/hle/service/mii/mii_manager.h b/src/core/hle/service/mii/mii_manager.h index 83ad3d343..5525fcd1c 100644 --- a/src/core/hle/service/mii/mii_manager.h +++ b/src/core/hle/service/mii/mii_manager.h | |||
| @@ -23,11 +23,16 @@ public: | |||
| 23 | CharInfo BuildRandom(Age age, Gender gender, Race race); | 23 | CharInfo BuildRandom(Age age, Gender gender, Race race); |
| 24 | CharInfo BuildDefault(std::size_t index); | 24 | CharInfo BuildDefault(std::size_t index); |
| 25 | CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const; | 25 | CharInfo ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const; |
| 26 | Ver3StoreData ConvertCharInfoToV3(const CharInfo& mii) const; | ||
| 27 | bool ValidateV3Info(const Ver3StoreData& mii_v3) const; | 26 | bool ValidateV3Info(const Ver3StoreData& mii_v3) const; |
| 28 | ResultVal<std::vector<MiiInfoElement>> GetDefault(SourceFlag source_flag); | 27 | ResultVal<std::vector<MiiInfoElement>> GetDefault(SourceFlag source_flag); |
| 29 | Result GetIndex(const CharInfo& info, u32& index); | 28 | Result GetIndex(const CharInfo& info, u32& index); |
| 30 | 29 | ||
| 30 | // This is nn::mii::detail::Ver::StoreDataRaw::BuildFromStoreData | ||
| 31 | Ver3StoreData BuildFromStoreData(const CharInfo& mii) const; | ||
| 32 | |||
| 33 | // This is nn::mii::detail::NfpStoreDataExtentionRaw::SetFromStoreData | ||
| 34 | NfpStoreDataExtension SetFromStoreData(const CharInfo& mii) const; | ||
| 35 | |||
| 31 | private: | 36 | private: |
| 32 | const Common::UUID user_id{}; | 37 | const Common::UUID user_id{}; |
| 33 | u64 update_counter{}; | 38 | u64 update_counter{}; |
diff --git a/src/core/hle/service/mii/types.h b/src/core/hle/service/mii/types.h index 1f53e6af3..c48d08d79 100644 --- a/src/core/hle/service/mii/types.h +++ b/src/core/hle/service/mii/types.h | |||
| @@ -370,6 +370,63 @@ struct Ver3StoreData { | |||
| 370 | }; | 370 | }; |
| 371 | static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); | 371 | static_assert(sizeof(Ver3StoreData) == 0x60, "Ver3StoreData is an invalid size"); |
| 372 | 372 | ||
| 373 | struct NfpStoreDataExtension { | ||
| 374 | u8 faceline_color; | ||
| 375 | u8 hair_color; | ||
| 376 | u8 eye_color; | ||
| 377 | u8 eyebrow_color; | ||
| 378 | u8 mouth_color; | ||
| 379 | u8 beard_color; | ||
| 380 | u8 glass_color; | ||
| 381 | u8 glass_type; | ||
| 382 | }; | ||
| 383 | static_assert(sizeof(NfpStoreDataExtension) == 0x8, "NfpStoreDataExtension is an invalid size"); | ||
| 384 | |||
| 385 | constexpr std::array<u8, 0x10> Ver3FacelineColorTable{ | ||
| 386 | 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x0, 0x1, 0x5, 0x5, | ||
| 387 | }; | ||
| 388 | |||
| 389 | constexpr std::array<u8, 100> Ver3HairColorTable{ | ||
| 390 | 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x0, 0x4, 0x3, 0x5, 0x4, 0x4, 0x6, 0x2, 0x0, | ||
| 391 | 0x6, 0x4, 0x3, 0x2, 0x2, 0x7, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, | ||
| 392 | 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0x0, 0x4, | ||
| 393 | 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, | ||
| 394 | 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x7, 0x5, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x7, | ||
| 395 | 0x7, 0x7, 0x7, 0x7, 0x3, 0x7, 0x7, 0x7, 0x7, 0x7, 0x0, 0x4, 0x4, 0x4, 0x4, | ||
| 396 | }; | ||
| 397 | |||
| 398 | constexpr std::array<u8, 100> Ver3EyeColorTable{ | ||
| 399 | 0x0, 0x2, 0x2, 0x2, 0x1, 0x3, 0x2, 0x3, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x2, 0x2, 0x4, | ||
| 400 | 0x2, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, | ||
| 401 | 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x0, 0x4, 0x4, | ||
| 402 | 0x4, 0x4, 0x4, 0x4, 0x4, 0x0, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, | ||
| 403 | 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, | ||
| 404 | 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, | ||
| 405 | }; | ||
| 406 | |||
| 407 | constexpr std::array<u8, 100> Ver3MouthlineColorTable{ | ||
| 408 | 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x1, 0x4, | ||
| 409 | 0x4, 0x4, 0x0, 0x1, 0x2, 0x3, 0x4, 0x4, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x1, 0x4, | ||
| 410 | 0x4, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, | ||
| 411 | 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, | ||
| 412 | 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, | ||
| 413 | 0x3, 0x3, 0x3, 0x3, 0x4, 0x0, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, 0x3, 0x3, | ||
| 414 | }; | ||
| 415 | |||
| 416 | constexpr std::array<u8, 100> Ver3GlassColorTable{ | ||
| 417 | 0x0, 0x1, 0x1, 0x1, 0x5, 0x1, 0x1, 0x4, 0x0, 0x5, 0x1, 0x1, 0x3, 0x5, 0x1, 0x2, 0x3, | ||
| 418 | 0x4, 0x5, 0x4, 0x2, 0x2, 0x4, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, | ||
| 419 | 0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, | ||
| 420 | 0x3, 0x3, 0x3, 0x3, 0x3, 0x0, 0x0, 0x0, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x0, 0x5, 0x5, | ||
| 421 | 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x1, 0x4, | ||
| 422 | 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, | ||
| 423 | }; | ||
| 424 | |||
| 425 | constexpr std::array<u8, 20> Ver3GlassTypeTable{ | ||
| 426 | 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x1, | ||
| 427 | 0x2, 0x1, 0x3, 0x7, 0x7, 0x6, 0x7, 0x8, 0x7, 0x7, | ||
| 428 | }; | ||
| 429 | |||
| 373 | struct MiiStoreData { | 430 | struct MiiStoreData { |
| 374 | using Name = std::array<char16_t, 10>; | 431 | using Name = std::array<char16_t, 10>; |
| 375 | 432 | ||