summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.h2
-rw-r--r--src/core/hle/service/nfc/common/device.cpp35
-rw-r--r--src/core/hle/service/nfc/common/device.h2
-rw-r--r--src/yuzu/configuration/config.cpp2
-rw-r--r--src/yuzu/configuration/configure_input_advanced.cpp2
-rw-r--r--src/yuzu/configuration/configure_input_advanced.ui22
-rw-r--r--src/yuzu_cmd/config.cpp1
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
56NfcDevice::~NfcDevice() { 53NfcDevice::~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
1204u64 NfcDevice::GetCurrentPosixTime() const {
1205 auto& standard_steady_clock{system.GetTimeManager().GetStandardSteadyClockCore()};
1206 return standard_steady_clock.GetCurrentTimePoint(system).time_point;
1207}
1208
1192u64 NfcDevice::RemoveVersionByte(u64 application_id) const { 1209u64 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
145void ConfigureInputAdvanced::LoadConfiguration() { 146void 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);