From cc44a43ebc53be6c8df1574c65787858d404b5dc Mon Sep 17 00:00:00 2001 From: dcave14 <122660710+dcave14@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:21:27 -0500 Subject: [PATCH] systemservice: add an option to report the notice screen as skipped (#1127) * systemservice: add an option to report the notice screen as skipped sceSystemServiceGetNoticeScreenSkipFlag always returned false. Return the new skip_notice_screen option instead. Games that check this flag skip their boot logo movies when it is set; Marvel's Wolverine, for example, then does not queue movies/BootSequence/BootSequence.movie. The option defaults to off, so behaviour is unchanged unless it is enabled with --skip-notice-screen true or the launcher's "Skip boot logos" checkbox. The launcher stores it with the other per-game settings, so it is included in per-game config import and export. Co-Authored-By: Claude Opus 5.5 * Shorten skip notice screen wording --------- Co-authored-by: Claude Opus 5.5 Co-authored-by: nmzik --- src/common/emulatorConfig.cpp | 4 ++++ src/common/emulatorConfig.h | 2 ++ src/launcher/forms/configuration_edit_dialog.ui | 6 ++++++ src/launcher/include/configuration.h | 2 ++ src/launcher/src/configuration.cpp | 2 ++ src/launcher/src/configurationEditDialog.cpp | 2 ++ src/launcher/src/mainDialog.cpp | 1 + src/libs/libSystemService.cpp | 2 +- src/main.cpp | 8 ++++++++ 9 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/common/emulatorConfig.cpp b/src/common/emulatorConfig.cpp index 2884b788b..d9377298d 100644 --- a/src/common/emulatorConfig.cpp +++ b/src/common/emulatorConfig.cpp @@ -164,6 +164,10 @@ bool PlayGoHackEnabled() { return g_config->playgo_hack_enabled; } +bool SkipNoticeScreen() { + return g_config->skip_notice_screen; +} + #if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS bool RedZoneProtectionEnabled() { return g_config->red_zone_protection_enabled; diff --git a/src/common/emulatorConfig.h b/src/common/emulatorConfig.h index fc29e94bf..3ec719d76 100644 --- a/src/common/emulatorConfig.h +++ b/src/common/emulatorConfig.h @@ -76,6 +76,7 @@ struct ConfigOptions { bool tessellation_enabled = false; bool trophy_enabled = true; bool playgo_hack_enabled = false; + bool skip_notice_screen = false; #if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS bool red_zone_protection_enabled = false; #endif @@ -126,6 +127,7 @@ bool ReadbackLinearImagesEnabled(); bool TessellationEnabled(); bool TrophyEnabled(); bool PlayGoHackEnabled(); +bool SkipNoticeScreen(); #if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS bool RedZoneProtectionEnabled(); #endif diff --git a/src/launcher/forms/configuration_edit_dialog.ui b/src/launcher/forms/configuration_edit_dialog.ui index 5b5feb5d9..f7ecff72c 100644 --- a/src/launcher/forms/configuration_edit_dialog.ui +++ b/src/launcher/forms/configuration_edit_dialog.ui @@ -179,6 +179,12 @@ Auto-hide cursor + + + Skip startup logos and notices in supported games. + Skip boot logos + + diff --git a/src/launcher/include/configuration.h b/src/launcher/include/configuration.h index fc7568d50..7a57013be 100644 --- a/src/launcher/include/configuration.h +++ b/src/launcher/include/configuration.h @@ -121,6 +121,7 @@ public: bool readback_linear_images = false; bool tessellation_enabled = false; bool trophy_enabled = true; + bool skip_notice_screen = false; int vblank_frequency = 60; int console_language = DEFAULT_CONSOLE_LANGUAGE; bool vulkan_validation_enabled = false; @@ -154,6 +155,7 @@ public: readback_linear_images = other.readback_linear_images; tessellation_enabled = other.tessellation_enabled; trophy_enabled = other.trophy_enabled; + skip_notice_screen = other.skip_notice_screen; vblank_frequency = other.vblank_frequency; console_language = other.console_language; vulkan_validation_enabled = other.vulkan_validation_enabled; diff --git a/src/launcher/src/configuration.cpp b/src/launcher/src/configuration.cpp index d5c6bc703..3429252c8 100644 --- a/src/launcher/src/configuration.cpp +++ b/src/launcher/src/configuration.cpp @@ -14,6 +14,7 @@ QVariantMap Configuration::GameSettings() const { KYTY_CFG_SET(readback_linear_images); KYTY_CFG_SET(tessellation_enabled); KYTY_CFG_SET(trophy_enabled); + KYTY_CFG_SET(skip_notice_screen); KYTY_CFG_SET(vblank_frequency); KYTY_CFG_SET(console_language); KYTY_CFG_SET(vulkan_validation_enabled); @@ -57,6 +58,7 @@ void Configuration::ReadGameSettingsValues(const Settings& s) { KYTY_CFG_GET(readback_linear_images); KYTY_CFG_GET(tessellation_enabled); trophy_enabled = s.value("trophy_enabled", trophy_enabled).toBool(); + KYTY_CFG_GET(skip_notice_screen); vblank_frequency = s.value("vblank_frequency", vblank_frequency).toInt(); console_language = s.value("console_language", console_language).toInt(); if (console_language < 0 || console_language > MAX_CONSOLE_LANGUAGE) { diff --git a/src/launcher/src/configurationEditDialog.cpp b/src/launcher/src/configurationEditDialog.cpp index 882a60f07..471f059d9 100644 --- a/src/launcher/src/configurationEditDialog.cpp +++ b/src/launcher/src/configurationEditDialog.cpp @@ -276,6 +276,7 @@ void ConfigurationEditDialog::Init(const Configuration& info) { m_ui->checkBox_hide_cursor->setChecked(info.hide_cursor_enabled); m_ui->checkBox_readback->setChecked(info.readback_linear_images); m_ui->checkBox_tessellation->setChecked(info.tessellation_enabled); + m_ui->checkBox_skip_notice_screen->setChecked(info.skip_notice_screen); m_ui->checkBox_trophy_notifications->setChecked(info.trophy_enabled); m_ui->spinBox_vblank_frequency->setValue(info.vblank_frequency); m_ui->comboBox_console_language->clear(); @@ -435,6 +436,7 @@ static void UpdateInfo(Configuration& info, Ui::ConfigurationEditDialog& ui, boo info.hide_cursor_enabled = ui.checkBox_hide_cursor->isChecked(); info.readback_linear_images = ui.checkBox_readback->isChecked(); info.tessellation_enabled = ui.checkBox_tessellation->isChecked(); + info.skip_notice_screen = ui.checkBox_skip_notice_screen->isChecked(); info.trophy_enabled = ui.checkBox_trophy_notifications->isChecked(); info.vblank_frequency = ui.spinBox_vblank_frequency->value(); info.console_language = ui.comboBox_console_language->currentIndex(); diff --git a/src/launcher/src/mainDialog.cpp b/src/launcher/src/mainDialog.cpp index 72f8d78d6..f2c7c3894 100644 --- a/src/launcher/src/mainDialog.cpp +++ b/src/launcher/src/mainDialog.cpp @@ -246,6 +246,7 @@ static QStringList CreateEmulatorArgs(const Configuration& info) { } args << "--readback-linear-images" << BoolArg(info.readback_linear_images); args << "--trophy-notifications" << BoolArg(info.trophy_enabled); + args << "--skip-notice-screen" << BoolArg(info.skip_notice_screen); if (info.tessellation_enabled) { args << "--tessellation"; } diff --git a/src/libs/libSystemService.cpp b/src/libs/libSystemService.cpp index da4ffa296..655096dc6 100644 --- a/src/libs/libSystemService.cpp +++ b/src/libs/libSystemService.cpp @@ -206,7 +206,7 @@ static int KYTY_SYSV_ABI SystemServiceGetNoticeScreenSkipFlag(bool* value) { return SYSTEM_SERVICE_ERROR_PARAMETER; } - *value = false; + *value = Config::SkipNoticeScreen(); return OK; } diff --git a/src/main.cpp b/src/main.cpp index eb4b2942e..1aceaf108 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -87,6 +87,9 @@ static void PrintUsage() { ::printf( " --trophy-notifications Show trophy unlock toasts and play their sound.\n"); ::printf(" --playgo-hack Use the supplied PlayGo stub fallback.\n"); + ::printf( + " --skip-notice-screen Skip startup logos and notices in supported games.\n" + " Default: false.\n"); #if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS ::printf(" --redzone Protect the guest SysV red zone.\n"); #endif @@ -428,6 +431,11 @@ static bool ParseArgs(int argc, char* argv[], RunOptions& options, bool& show_he ::printf("invalid boolean for %s: %s\n", arg.c_str(), value.c_str()); return false; } + } else if (arg == "--skip-notice-screen") { + if (!ParseBool(value, options.config.skip_notice_screen)) { + ::printf("invalid boolean for %s: %s\n", arg.c_str(), value.c_str()); + return false; + } } else if (arg == "--keymap") { const auto split = value.find('='); if (split == std::string::npos || split == 0 || split + 1 == value.size()) {