fix(fatal): handle unknown error module 359 gracefully

Handle error 2359-2618 (module 359, description 2618) gracefully
by logging a warning instead of crashing, similar to module 56.
This allows games like SSBU to continue execution when encountering
this error code.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-12-26 16:52:33 +10:00
parent 38d4152021
commit 499b3c1a59

View File

@@ -85,6 +85,14 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F
"Error code: 2056-{:04d} (0x{:08X})\n"
"This may be related to online services or network functionality.\n\n",
description, error_code.raw);
} else if (module == 359) {
module_note = fmt::format(
"\n⚠️ WARNING: Error module 359 is undefined/unknown!\n"
"This error may be game-generated or from an unimplemented service.\n"
"Error code: 2359-{:04d} (0x{:08X})\n"
"This is commonly reported by Super Smash Bros. Ultimate during multiplayer connections.\n"
"It may be related to network connectivity or online service availability.\n\n",
description, error_code.raw);
}
std::string crash_report = fmt::format(
@@ -139,13 +147,18 @@ static void ThrowFatalError(Core::System& system, Result error_code, FatalType f
GenerateErrorReport(system, error_code, info);
[[fallthrough]];
case FatalType::ErrorScreen:
// For Module 56 errors (unknown/game-generated), log and continue instead of crashing
// These are often related to online services being unavailable
// For unknown module errors (game-generated), log and continue instead of crashing
// These are often related to online services being unavailable or network issues
if (module == 56) {
LOG_WARNING(Service_Fatal,
"Module 56 error detected - likely game-generated due to unavailable "
"online services. Continuing execution instead of crashing.");
break;
} else if (module == 359) {
LOG_WARNING(Service_Fatal,
"Module 359 error detected - likely game-generated by SSBU during multiplayer "
"connection attempts. Continuing execution instead of crashing.");
break;
}
// Since we have no fatal:u error screen. We should just kill execution instead
ASSERT(false);