diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/settings.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/nfc/common/device.cpp | 35 | ||||
| -rw-r--r-- | src/core/hle/service/nfc/common/device.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_advanced.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_advanced.ui | 22 | ||||
| -rw-r--r-- | src/yuzu_cmd/config.cpp | 1 |
7 files changed, 53 insertions, 13 deletions
diff --git a/src/common/settings.h b/src/common/settings.h index f4eb4e3cd..5f4caaab9 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -535,6 +535,8 @@ struct Values { | |||
| 535 | Setting<bool> enable_ir_sensor{false, "enable_ir_sensor"}; | 535 | Setting<bool> enable_ir_sensor{false, "enable_ir_sensor"}; |
| 536 | Setting<std::string> ir_sensor_device{"auto", "ir_sensor_device"}; | 536 | Setting<std::string> ir_sensor_device{"auto", "ir_sensor_device"}; |
| 537 | 537 | ||
| 538 | Setting<bool> random_amiibo_id{false, "random_amiibo_id"}; | ||
| 539 | |||
| 538 | // Data Storage | 540 | // Data Storage |
| 539 | Setting<bool> use_virtual_sd{true, "use_virtual_sd"}; | 541 | Setting<bool> use_virtual_sd{true, "use_virtual_sd"}; |
| 540 | Setting<bool> gamecard_inserted{false, "gamecard_inserted"}; | 542 | Setting<bool> gamecard_inserted{false, "gamecard_inserted"}; |
diff --git a/src/core/hle/service/nfc/common/device.cpp b/src/core/hle/service/nfc/common/device.cpp index e5de65ce0..322bde2ed 100644 --- a/src/core/hle/service/nfc/common/device.cpp +++ b/src/core/hle/service/nfc/common/device.cpp | |||
| @@ -48,9 +48,6 @@ NfcDevice::NfcDevice(Core::HID::NpadIdType npad_id_, Core::System& system_, | |||
| 48 | }; | 48 | }; |
| 49 | is_controller_set = true; | 49 | is_controller_set = true; |
| 50 | callback_key = npad_device->SetCallback(engine_callback); | 50 | callback_key = npad_device->SetCallback(engine_callback); |
| 51 | |||
| 52 | auto& standard_steady_clock{system.GetTimeManager().GetStandardSteadyClockCore()}; | ||
| 53 | current_posix_time = standard_steady_clock.GetCurrentTimePoint(system).time_point; | ||
| 54 | } | 51 | } |
| 55 | 52 | ||
| 56 | NfcDevice::~NfcDevice() { | 53 | NfcDevice::~NfcDevice() { |
| @@ -227,11 +224,21 @@ Result NfcDevice::GetTagInfo(NFP::TagInfo& tag_info, bool is_mifare) const { | |||
| 227 | return ResultWrongDeviceState; | 224 | return ResultWrongDeviceState; |
| 228 | } | 225 | } |
| 229 | 226 | ||
| 227 | UniqueSerialNumber uuid = encrypted_tag_data.uuid.uid; | ||
| 228 | |||
| 229 | // Generate random UUID to bypass amiibo load limits | ||
| 230 | if (Settings::values.random_amiibo_id) { | ||
| 231 | Common::TinyMT rng{}; | ||
| 232 | rng.Initialize(static_cast<u32>(GetCurrentPosixTime())); | ||
| 233 | rng.GenerateRandomBytes(uuid.data(), sizeof(UniqueSerialNumber)); | ||
| 234 | uuid[3] = 0x88 ^ uuid[0] ^ uuid[1] ^ uuid[2]; | ||
| 235 | } | ||
| 236 | |||
| 230 | if (is_mifare) { | 237 | if (is_mifare) { |
| 231 | tag_info = { | 238 | tag_info = { |
| 232 | .uuid = encrypted_tag_data.uuid.uid, | 239 | .uuid = uuid, |
| 233 | .uuid_extension = {}, | 240 | .uuid_extension = {}, |
| 234 | .uuid_length = static_cast<u8>(encrypted_tag_data.uuid.uid.size()), | 241 | .uuid_length = static_cast<u8>(uuid.size()), |
| 235 | .protocol = NfcProtocol::TypeA, | 242 | .protocol = NfcProtocol::TypeA, |
| 236 | .tag_type = TagType::Type4, | 243 | .tag_type = TagType::Type4, |
| 237 | }; | 244 | }; |
| @@ -240,9 +247,9 @@ Result NfcDevice::GetTagInfo(NFP::TagInfo& tag_info, bool is_mifare) const { | |||
| 240 | 247 | ||
| 241 | // Protocol and tag type may change here | 248 | // Protocol and tag type may change here |
| 242 | tag_info = { | 249 | tag_info = { |
| 243 | .uuid = encrypted_tag_data.uuid.uid, | 250 | .uuid = uuid, |
| 244 | .uuid_extension = {}, | 251 | .uuid_extension = {}, |
| 245 | .uuid_length = static_cast<u8>(encrypted_tag_data.uuid.uid.size()), | 252 | .uuid_length = static_cast<u8>(uuid.size()), |
| 246 | .protocol = NfcProtocol::TypeA, | 253 | .protocol = NfcProtocol::TypeA, |
| 247 | .tag_type = TagType::Type2, | 254 | .tag_type = TagType::Type2, |
| 248 | }; | 255 | }; |
| @@ -406,7 +413,7 @@ Result NfcDevice::Flush() { | |||
| 406 | 413 | ||
| 407 | auto& settings = tag_data.settings; | 414 | auto& settings = tag_data.settings; |
| 408 | 415 | ||
| 409 | const auto& current_date = GetAmiiboDate(current_posix_time); | 416 | const auto& current_date = GetAmiiboDate(GetCurrentPosixTime()); |
| 410 | if (settings.write_date.raw_date != current_date.raw_date) { | 417 | if (settings.write_date.raw_date != current_date.raw_date) { |
| 411 | settings.write_date = current_date; | 418 | settings.write_date = current_date; |
| 412 | UpdateSettingsCrc(); | 419 | UpdateSettingsCrc(); |
| @@ -525,6 +532,7 @@ Result NfcDevice::GetModelInfo(NFP::ModelInfo& model_info) const { | |||
| 525 | } | 532 | } |
| 526 | 533 | ||
| 527 | const auto& model_info_data = encrypted_tag_data.user_memory.model_info; | 534 | const auto& model_info_data = encrypted_tag_data.user_memory.model_info; |
| 535 | |||
| 528 | model_info = { | 536 | model_info = { |
| 529 | .character_id = model_info_data.character_id, | 537 | .character_id = model_info_data.character_id, |
| 530 | .character_variant = model_info_data.character_variant, | 538 | .character_variant = model_info_data.character_variant, |
| @@ -669,6 +677,7 @@ Result NfcDevice::DeleteRegisterInfo() { | |||
| 669 | } | 677 | } |
| 670 | 678 | ||
| 671 | Common::TinyMT rng{}; | 679 | Common::TinyMT rng{}; |
| 680 | rng.Initialize(static_cast<u32>(GetCurrentPosixTime())); | ||
| 672 | rng.GenerateRandomBytes(&tag_data.owner_mii, sizeof(tag_data.owner_mii)); | 681 | rng.GenerateRandomBytes(&tag_data.owner_mii, sizeof(tag_data.owner_mii)); |
| 673 | rng.GenerateRandomBytes(&tag_data.settings.amiibo_name, sizeof(tag_data.settings.amiibo_name)); | 682 | rng.GenerateRandomBytes(&tag_data.settings.amiibo_name, sizeof(tag_data.settings.amiibo_name)); |
| 674 | rng.GenerateRandomBytes(&tag_data.unknown, sizeof(u8)); | 683 | rng.GenerateRandomBytes(&tag_data.unknown, sizeof(u8)); |
| @@ -701,7 +710,7 @@ Result NfcDevice::SetRegisterInfoPrivate(const NFP::RegisterInfoPrivate& registe | |||
| 701 | auto& settings = tag_data.settings; | 710 | auto& settings = tag_data.settings; |
| 702 | 711 | ||
| 703 | if (tag_data.settings.settings.amiibo_initialized == 0) { | 712 | if (tag_data.settings.settings.amiibo_initialized == 0) { |
| 704 | settings.init_date = GetAmiiboDate(current_posix_time); | 713 | settings.init_date = GetAmiiboDate(GetCurrentPosixTime()); |
| 705 | settings.write_date.raw_date = 0; | 714 | settings.write_date.raw_date = 0; |
| 706 | } | 715 | } |
| 707 | 716 | ||
| @@ -868,6 +877,7 @@ Result NfcDevice::SetApplicationArea(std::span<const u8> data) { | |||
| 868 | } | 877 | } |
| 869 | 878 | ||
| 870 | Common::TinyMT rng{}; | 879 | Common::TinyMT rng{}; |
| 880 | rng.Initialize(static_cast<u32>(GetCurrentPosixTime())); | ||
| 871 | std::memcpy(tag_data.application_area.data(), data.data(), data.size()); | 881 | std::memcpy(tag_data.application_area.data(), data.data(), data.size()); |
| 872 | // Fill remaining data with random numbers | 882 | // Fill remaining data with random numbers |
| 873 | rng.GenerateRandomBytes(tag_data.application_area.data() + data.size(), | 883 | rng.GenerateRandomBytes(tag_data.application_area.data() + data.size(), |
| @@ -924,6 +934,7 @@ Result NfcDevice::RecreateApplicationArea(u32 access_id, std::span<const u8> dat | |||
| 924 | } | 934 | } |
| 925 | 935 | ||
| 926 | Common::TinyMT rng{}; | 936 | Common::TinyMT rng{}; |
| 937 | rng.Initialize(static_cast<u32>(GetCurrentPosixTime())); | ||
| 927 | std::memcpy(tag_data.application_area.data(), data.data(), data.size()); | 938 | std::memcpy(tag_data.application_area.data(), data.data(), data.size()); |
| 928 | // Fill remaining data with random numbers | 939 | // Fill remaining data with random numbers |
| 929 | rng.GenerateRandomBytes(tag_data.application_area.data() + data.size(), | 940 | rng.GenerateRandomBytes(tag_data.application_area.data() + data.size(), |
| @@ -973,6 +984,7 @@ Result NfcDevice::DeleteApplicationArea() { | |||
| 973 | } | 984 | } |
| 974 | 985 | ||
| 975 | Common::TinyMT rng{}; | 986 | Common::TinyMT rng{}; |
| 987 | rng.Initialize(static_cast<u32>(GetCurrentPosixTime())); | ||
| 976 | rng.GenerateRandomBytes(tag_data.application_area.data(), sizeof(NFP::ApplicationArea)); | 988 | rng.GenerateRandomBytes(tag_data.application_area.data(), sizeof(NFP::ApplicationArea)); |
| 977 | rng.GenerateRandomBytes(&tag_data.application_id, sizeof(u64)); | 989 | rng.GenerateRandomBytes(&tag_data.application_id, sizeof(u64)); |
| 978 | rng.GenerateRandomBytes(&tag_data.application_area_id, sizeof(u32)); | 990 | rng.GenerateRandomBytes(&tag_data.application_area_id, sizeof(u32)); |
| @@ -1189,6 +1201,11 @@ NFP::AmiiboDate NfcDevice::GetAmiiboDate(s64 posix_time) const { | |||
| 1189 | return amiibo_date; | 1201 | return amiibo_date; |
| 1190 | } | 1202 | } |
| 1191 | 1203 | ||
| 1204 | u64 NfcDevice::GetCurrentPosixTime() const { | ||
| 1205 | auto& standard_steady_clock{system.GetTimeManager().GetStandardSteadyClockCore()}; | ||
| 1206 | return standard_steady_clock.GetCurrentTimePoint(system).time_point; | ||
| 1207 | } | ||
| 1208 | |||
| 1192 | u64 NfcDevice::RemoveVersionByte(u64 application_id) const { | 1209 | u64 NfcDevice::RemoveVersionByte(u64 application_id) const { |
| 1193 | return application_id & ~(0xfULL << NFP::application_id_version_offset); | 1210 | return application_id & ~(0xfULL << NFP::application_id_version_offset); |
| 1194 | } | 1211 | } |
diff --git a/src/core/hle/service/nfc/common/device.h b/src/core/hle/service/nfc/common/device.h index 654eda98e..98e1945c1 100644 --- a/src/core/hle/service/nfc/common/device.h +++ b/src/core/hle/service/nfc/common/device.h | |||
| @@ -105,6 +105,7 @@ private: | |||
| 105 | NFP::AmiiboName GetAmiiboName(const NFP::AmiiboSettings& settings) const; | 105 | NFP::AmiiboName GetAmiiboName(const NFP::AmiiboSettings& settings) const; |
| 106 | void SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name); | 106 | void SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name); |
| 107 | NFP::AmiiboDate GetAmiiboDate(s64 posix_time) const; | 107 | NFP::AmiiboDate GetAmiiboDate(s64 posix_time) const; |
| 108 | u64 GetCurrentPosixTime() const; | ||
| 108 | u64 RemoveVersionByte(u64 application_id) const; | 109 | u64 RemoveVersionByte(u64 application_id) const; |
| 109 | void UpdateSettingsCrc(); | 110 | void UpdateSettingsCrc(); |
| 110 | void UpdateRegisterInfoCrc(); | 111 | void UpdateRegisterInfoCrc(); |
| @@ -127,7 +128,6 @@ private: | |||
| 127 | bool is_data_moddified{}; | 128 | bool is_data_moddified{}; |
| 128 | bool is_app_area_open{}; | 129 | bool is_app_area_open{}; |
| 129 | bool is_plain_amiibo{}; | 130 | bool is_plain_amiibo{}; |
| 130 | s64 current_posix_time{}; | ||
| 131 | NFP::MountTarget mount_target{NFP::MountTarget::None}; | 131 | NFP::MountTarget mount_target{NFP::MountTarget::None}; |
| 132 | 132 | ||
| 133 | NFP::NTAG215File tag_data{}; | 133 | NFP::NTAG215File tag_data{}; |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index a49d12266..b94d36838 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -443,6 +443,7 @@ void Config::ReadControlValues() { | |||
| 443 | ReadBasicSetting(Settings::values.mouse_panning_sensitivity); | 443 | ReadBasicSetting(Settings::values.mouse_panning_sensitivity); |
| 444 | ReadBasicSetting(Settings::values.enable_joycon_driver); | 444 | ReadBasicSetting(Settings::values.enable_joycon_driver); |
| 445 | ReadBasicSetting(Settings::values.enable_procon_driver); | 445 | ReadBasicSetting(Settings::values.enable_procon_driver); |
| 446 | ReadBasicSetting(Settings::values.random_amiibo_id); | ||
| 446 | 447 | ||
| 447 | ReadBasicSetting(Settings::values.tas_enable); | 448 | ReadBasicSetting(Settings::values.tas_enable); |
| 448 | ReadBasicSetting(Settings::values.tas_loop); | 449 | ReadBasicSetting(Settings::values.tas_loop); |
| @@ -1150,6 +1151,7 @@ void Config::SaveControlValues() { | |||
| 1150 | WriteBasicSetting(Settings::values.enable_raw_input); | 1151 | WriteBasicSetting(Settings::values.enable_raw_input); |
| 1151 | WriteBasicSetting(Settings::values.enable_joycon_driver); | 1152 | WriteBasicSetting(Settings::values.enable_joycon_driver); |
| 1152 | WriteBasicSetting(Settings::values.enable_procon_driver); | 1153 | WriteBasicSetting(Settings::values.enable_procon_driver); |
| 1154 | WriteBasicSetting(Settings::values.random_amiibo_id); | ||
| 1153 | WriteBasicSetting(Settings::values.keyboard_enabled); | 1155 | WriteBasicSetting(Settings::values.keyboard_enabled); |
| 1154 | WriteBasicSetting(Settings::values.emulate_analog_keyboard); | 1156 | WriteBasicSetting(Settings::values.emulate_analog_keyboard); |
| 1155 | WriteBasicSetting(Settings::values.mouse_panning_sensitivity); | 1157 | WriteBasicSetting(Settings::values.mouse_panning_sensitivity); |
diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index 8d81322f3..f13156434 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp | |||
| @@ -140,6 +140,7 @@ void ConfigureInputAdvanced::ApplyConfiguration() { | |||
| 140 | Settings::values.enable_ir_sensor = ui->enable_ir_sensor->isChecked(); | 140 | Settings::values.enable_ir_sensor = ui->enable_ir_sensor->isChecked(); |
| 141 | Settings::values.enable_joycon_driver = ui->enable_joycon_driver->isChecked(); | 141 | Settings::values.enable_joycon_driver = ui->enable_joycon_driver->isChecked(); |
| 142 | Settings::values.enable_procon_driver = ui->enable_procon_driver->isChecked(); | 142 | Settings::values.enable_procon_driver = ui->enable_procon_driver->isChecked(); |
| 143 | Settings::values.random_amiibo_id = ui->random_amiibo_id->isChecked(); | ||
| 143 | } | 144 | } |
| 144 | 145 | ||
| 145 | void ConfigureInputAdvanced::LoadConfiguration() { | 146 | void ConfigureInputAdvanced::LoadConfiguration() { |
| @@ -176,6 +177,7 @@ void ConfigureInputAdvanced::LoadConfiguration() { | |||
| 176 | ui->enable_ir_sensor->setChecked(Settings::values.enable_ir_sensor.GetValue()); | 177 | ui->enable_ir_sensor->setChecked(Settings::values.enable_ir_sensor.GetValue()); |
| 177 | ui->enable_joycon_driver->setChecked(Settings::values.enable_joycon_driver.GetValue()); | 178 | ui->enable_joycon_driver->setChecked(Settings::values.enable_joycon_driver.GetValue()); |
| 178 | ui->enable_procon_driver->setChecked(Settings::values.enable_procon_driver.GetValue()); | 179 | ui->enable_procon_driver->setChecked(Settings::values.enable_procon_driver.GetValue()); |
| 180 | ui->random_amiibo_id->setChecked(Settings::values.random_amiibo_id.GetValue()); | ||
| 179 | 181 | ||
| 180 | UpdateUIEnabled(); | 182 | UpdateUIEnabled(); |
| 181 | } | 183 | } |
diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui index 0eb2b34bc..2e8b13660 100644 --- a/src/yuzu/configuration/configure_input_advanced.ui +++ b/src/yuzu/configuration/configure_input_advanced.ui | |||
| @@ -2728,6 +2728,22 @@ | |||
| 2728 | </widget> | 2728 | </widget> |
| 2729 | </item> | 2729 | </item> |
| 2730 | <item row="7" column="0"> | 2730 | <item row="7" column="0"> |
| 2731 | <widget class="QCheckBox" name="random_amiibo_id"> | ||
| 2732 | <property name="toolTip"> | ||
| 2733 | <string>Allows unlimited uses of the same Amiibo in games that would otherwise limit you to one use.</string> | ||
| 2734 | </property> | ||
| 2735 | <property name="minimumSize"> | ||
| 2736 | <size> | ||
| 2737 | <width>0</width> | ||
| 2738 | <height>23</height> | ||
| 2739 | </size> | ||
| 2740 | </property> | ||
| 2741 | <property name="text"> | ||
| 2742 | <string>Use random Amiibo ID</string> | ||
| 2743 | </property> | ||
| 2744 | </widget> | ||
| 2745 | </item> | ||
| 2746 | <item row="8" column="0"> | ||
| 2731 | <widget class="QCheckBox" name="mouse_panning"> | 2747 | <widget class="QCheckBox" name="mouse_panning"> |
| 2732 | <property name="minimumSize"> | 2748 | <property name="minimumSize"> |
| 2733 | <size> | 2749 | <size> |
| @@ -2740,7 +2756,7 @@ | |||
| 2740 | </property> | 2756 | </property> |
| 2741 | </widget> | 2757 | </widget> |
| 2742 | </item> | 2758 | </item> |
| 2743 | <item row="7" column="2"> | 2759 | <item row="8" column="2"> |
| 2744 | <widget class="QSpinBox" name="mouse_panning_sensitivity"> | 2760 | <widget class="QSpinBox" name="mouse_panning_sensitivity"> |
| 2745 | <property name="toolTip"> | 2761 | <property name="toolTip"> |
| 2746 | <string>Mouse sensitivity</string> | 2762 | <string>Mouse sensitivity</string> |
| @@ -2762,14 +2778,14 @@ | |||
| 2762 | </property> | 2778 | </property> |
| 2763 | </widget> | 2779 | </widget> |
| 2764 | </item> | 2780 | </item> |
| 2765 | <item row="8" column="0"> | 2781 | <item row="9" column="0"> |
| 2766 | <widget class="QLabel" name="motion_touch"> | 2782 | <widget class="QLabel" name="motion_touch"> |
| 2767 | <property name="text"> | 2783 | <property name="text"> |
| 2768 | <string>Motion / Touch</string> | 2784 | <string>Motion / Touch</string> |
| 2769 | </property> | 2785 | </property> |
| 2770 | </widget> | 2786 | </widget> |
| 2771 | </item> | 2787 | </item> |
| 2772 | <item row="8" column="2"> | 2788 | <item row="9" column="2"> |
| 2773 | <widget class="QPushButton" name="buttonMotionTouch"> | 2789 | <widget class="QPushButton" name="buttonMotionTouch"> |
| 2774 | <property name="text"> | 2790 | <property name="text"> |
| 2775 | <string>Configure</string> | 2791 | <string>Configure</string> |
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index abe7092fc..dc9a3d68f 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp | |||
| @@ -169,6 +169,7 @@ void Config::ReadValues() { | |||
| 169 | ReadSetting("ControlsGeneral", Settings::values.enable_raw_input); | 169 | ReadSetting("ControlsGeneral", Settings::values.enable_raw_input); |
| 170 | ReadSetting("ControlsGeneral", Settings::values.enable_joycon_driver); | 170 | ReadSetting("ControlsGeneral", Settings::values.enable_joycon_driver); |
| 171 | ReadSetting("ControlsGeneral", Settings::values.enable_procon_driver); | 171 | ReadSetting("ControlsGeneral", Settings::values.enable_procon_driver); |
| 172 | ReadSetting("ControlsGeneral", Settings::values.random_amiibo_id); | ||
| 172 | ReadSetting("ControlsGeneral", Settings::values.emulate_analog_keyboard); | 173 | ReadSetting("ControlsGeneral", Settings::values.emulate_analog_keyboard); |
| 173 | ReadSetting("ControlsGeneral", Settings::values.vibration_enabled); | 174 | ReadSetting("ControlsGeneral", Settings::values.vibration_enabled); |
| 174 | ReadSetting("ControlsGeneral", Settings::values.enable_accurate_vibrations); | 175 | ReadSetting("ControlsGeneral", Settings::values.enable_accurate_vibrations); |