aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.h10
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp83
-rw-r--r--src/frontend_common/settings_generator.cpp18
-rw-r--r--src/yuzu/configuration/configure_debug.cpp6
4 files changed, 88 insertions, 29 deletions
diff --git a/src/common/settings.h b/src/common/settings.h
index 9a7d3a30d3..a7cf800142 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -620,11 +620,11 @@ struct Values {
"language_index",
Category::System};
SwitchableSetting<Region, true> region_index{linkage, Region::Usa, "region_index", Category::System};
- SwitchableSetting<TimeZone, true> time_zone_index{linkage, TimeZone::Auto,
- "time_zone_index", Category::System};
+ SwitchableSetting<TimeZone, true> time_zone_index{linkage, TimeZone::Auto, "time_zone_index", Category::System};
+ Setting<u32> serial_battery{linkage, 0, "serial_battery", Category::System};
+ Setting<u32> serial_unit{linkage, 0, "serial_unit", Category::System};
// Measured in seconds since epoch
- SwitchableSetting<bool> custom_rtc_enabled{
- linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true};
+ SwitchableSetting<bool> custom_rtc_enabled{linkage, false, "custom_rtc_enabled", Category::System, Specialization::Paired, true, true};
SwitchableSetting<s64> custom_rtc{
linkage, 0, "custom_rtc", Category::System, Specialization::Time,
false, true, &custom_rtc_enabled};
@@ -794,8 +794,6 @@ struct Values {
true};
// Miscellaneous
- Setting<std::string> serial_battery{linkage, std::string(), "serial_battery", Category::Miscellaneous};
- Setting<std::string> serial_unit{linkage, std::string(), "serial_unit", Category::Miscellaneous};
Setting<std::string> log_filter{linkage, "*:Info", "log_filter", Category::Miscellaneous};
Setting<bool> log_flush_line{linkage, false, "flush_line", Category::Miscellaneous, Specialization::Default, true, true};
Setting<bool> censor_username{linkage, true, "censor_username", Category::Miscellaneous};
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index f87dd847ba..87d6bf2a36 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
@@ -980,25 +980,82 @@ Result ISystemSettingsServer::SetPrimaryAlbumStorage(PrimaryAlbumStorage primary
R_SUCCEED();
}
+static void Fill3DS_CRC(u32 d, char* data) {
+ std::array<u8, 10> digits = {
+ u8((d / 1000000000) % 100),
+ u8((d / 100000000) % 10),
+ u8((d / 10000000) % 10),
+ u8((d / 1000000) % 10),
+ u8((d / 100000) % 10),
+ u8((d / 10000) % 10),
+ u8((d / 1000) % 10),
+ u8((d / 100) % 10),
+ u8((d / 10) % 10),
+ u8(d % 10),
+ };
+ // Normalize to retail values
+ std::array<u8, 4> retail_digits = { 1, 4, 5, 7 };
+ digits[0] = retail_digits[(d % 10) % 4];
+ digits[1] = 0;
+ //
+ for (size_t i = 0; i < sizeof(digits); ++i)
+ data[i] = char(digits[i] + '0');
+ u8 sum_odd = 0, sum_even = 0;
+ for (size_t i = 0; i < sizeof(digits); i += 2) {
+ sum_odd += digits[i + 0];
+ sum_even += digits[i + 1];
+ }
+ u8 sum_digit = u8(((sum_even * 3) + sum_odd) % 10);
+ if (sum_digit != 0)
+ sum_digit = 10 - sum_digit;
+ data[sizeof(digits)] = char(sum_digit + '0');
+}
+
Result ISystemSettingsServer::GetBatteryLot(Out<BatteryLot> out_battery_lot) {
LOG_INFO(Service_SET, "called");
- *out_battery_lot = {"YUZU0EMULATOR14022024"};
- if (auto const s = ::Settings::values.serial_battery.GetValue(); !s.empty()) {
- auto const max_size = out_battery_lot->lot_number.size();
- auto const end = s.size() > max_size ? s.begin() + max_size : s.end();
- std::copy(s.begin(), end, out_battery_lot->lot_number.begin());
- }
+ *out_battery_lot = []{
+ u32 d = ::Settings::values.serial_battery.GetValue();
+ BatteryLot c{};
+ c.lot_number[0] = 'B';
+ c.lot_number[1] = 'H';
+ c.lot_number[2] = 'A';
+ c.lot_number[3] = 'C';
+ // TODO: I have no fucking idea what the letters mean
+ c.lot_number[4] = 'H';
+ c.lot_number[5] = 'Z';
+ c.lot_number[6] = 'Z';
+ c.lot_number[7] = 'A';
+ c.lot_number[8] = 'D';
+ c.lot_number[9] = char(((d / 100000) % 26) + 'A');
+ Fill3DS_CRC(d, c.lot_number.data() + 10);
+ return c;
+ }();
R_SUCCEED();
}
Result ISystemSettingsServer::GetSerialNumber(Out<SerialNumber> out_console_serial) {
LOG_INFO(Service_SET, "called");
- *out_console_serial = {"YUZ10000000001"};
- if (auto const s = ::Settings::values.serial_unit.GetValue(); !s.empty()) {
- auto const max_size = out_console_serial->serial_number.size();
- auto const end = s.size() > max_size ? s.begin() + max_size : s.end();
- std::copy(s.begin(), end, out_console_serial->serial_number.begin());
- }
+ *out_console_serial = []{
+ u32 d = ::Settings::values.serial_unit.GetValue();
+ SerialNumber c{};
+ c.serial_number[0] = 'X';
+ c.serial_number[1] = 'A';
+ c.serial_number[2] = [] {
+ // Adding another setting would be tedious so... let's just reuse region_index :)
+ switch (::Settings::values.region_index.GetValue()) {
+ case ::Settings::Region::Japan: return 'J';
+ case ::Settings::Region::Usa: return 'W';
+ case ::Settings::Region::Europe: return 'E';
+ case ::Settings::Region::Australia: return 'M'; //pretend its Malaysia
+ case ::Settings::Region::China:
+ case ::Settings::Region::Taiwan: return 'C';
+ case ::Settings::Region::Korea: return 'K';
+ default: return 'W';
+ }
+ }();
+ Fill3DS_CRC(d, c.serial_number.data() + 3);
+ return c;
+ }();
R_SUCCEED();
}
diff --git a/src/frontend_common/settings_generator.cpp b/src/frontend_common/settings_generator.cpp
index 0f09878b30..46625656b1 100644
--- a/src/frontend_common/settings_generator.cpp
+++ b/src/frontend_common/settings_generator.cpp
@@ -11,9 +11,8 @@ namespace FrontendCommon {
void GenerateSettings() {
static std::random_device rd;
- // Web Token //
- auto &token_setting = Settings::values.eden_token;
- if (token_setting.GetValue().empty()) {
+ // Web Token
+ if (Settings::values.eden_token.GetValue().empty()) {
static constexpr const size_t token_length = 48;
static constexpr const frozen::string token_set = "abcdefghijklmnopqrstuvwxyz";
static std::uniform_int_distribution<int> token_dist(0, token_set.size() - 1);
@@ -23,9 +22,18 @@ void GenerateSettings() {
size_t idx = token_dist(rd);
result += token_set[idx];
}
-
- token_setting.SetValue(result);
+ Settings::values.eden_token.SetValue(result);
}
+
+ // Randomly generated number because, well, we fill the rest automagically ;)
+ // Other serial parts are filled by Region_Index
+ std::random_device device;
+ std::mt19937 gen(device());
+ std::uniform_int_distribution<u32> distribution(1, (std::numeric_limits<u32>::max)());
+ if (Settings::values.serial_unit.GetValue() == 0)
+ Settings::values.serial_unit.SetValue(distribution(gen));
+ if (Settings::values.serial_battery.GetValue() == 0)
+ Settings::values.serial_battery.SetValue(distribution(gen));
}
}
diff --git a/src/yuzu/configuration/configure_debug.cpp b/src/yuzu/configuration/configure_debug.cpp
index 0de5f46dcc..bc835d35a2 100644
--- a/src/yuzu/configuration/configure_debug.cpp
+++ b/src/yuzu/configuration/configure_debug.cpp
@@ -1,4 +1,4 @@
-// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2016 Citra Emulator Project
@@ -57,10 +57,6 @@ void ConfigureDebug::SetConfiguration() {
#endif
// Immutable after starting
- ui->serial_battery_edit->setEnabled(runtime_lock);
- ui->serial_battery_edit->setText(QString::fromStdString(Settings::values.serial_battery.GetValue()));
- ui->serial_board_edit->setEnabled(runtime_lock);
- ui->serial_board_edit->setText(QString::fromStdString(Settings::values.serial_unit.GetValue()));
ui->homebrew_args_edit->setEnabled(runtime_lock);
ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args.GetValue()));
ui->toggle_console->setEnabled(runtime_lock);