From ddee1e1235cb8a7136e2aa2ce55f91b28b84c9d2 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Sat, 11 Apr 2026 16:36:25 -0500 Subject: Fix game launchers failing to find INI files due to registry key casing Wine registry value names are case-sensitive. Game launchers (FNV, Oblivion, etc.) look up "installed path" (lowercase) but Fluorine was writing "Installed Path" (capitalized), causing "Unable to find an INI file" errors. Also adds trailing backslash to match Steam's path format and fixes the registry mismatch dialog to ignore trailing separator differences. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/src/knowngames.h | 20 ++++++++++---------- src/src/organizercore.cpp | 11 ++++++++++- src/src/prefixsetuprunner.cpp | 3 +++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/src/knowngames.h b/src/src/knowngames.h index a29e5dc..42679b7 100644 --- a/src/src/knowngames.h +++ b/src/src/knowngames.h @@ -29,35 +29,35 @@ inline constexpr KnownGame KNOWN_GAMES[] = { R"(Software\SureAI\Enderal SE)", "installed path", "Enderal Special Edition"}, {"Fallout 3", "22300", "1454315831", "adeae8bbfc94427db57c7dfecce3f1d4", "Fallout3", "Fallout3", nullptr, - R"(Software\Bethesda Softworks\Fallout3)", "Installed Path", "Fallout 3"}, + R"(Software\Bethesda Softworks\Fallout3)", "installed path", "Fallout 3"}, {"Fallout 4", "377160", "1998527297", "61d52ce4d09d41e48800c22784d13ae8", "Fallout4", "Fallout4", nullptr, - R"(Software\Bethesda Softworks\Fallout4)", "Installed Path", "Fallout 4"}, + R"(Software\Bethesda Softworks\Fallout4)", "installed path", "Fallout 4"}, {"Fallout 4 VR", "611660", nullptr, nullptr, "Fallout4VR", nullptr, nullptr, - R"(Software\Bethesda Softworks\Fallout 4 VR)", "Installed Path", "Fallout 4 VR"}, + R"(Software\Bethesda Softworks\Fallout 4 VR)", "installed path", "Fallout 4 VR"}, {"Fallout New Vegas", "22380", "1454587428", "5daeb974a22a435988892319b3a4f476", "FalloutNV", "FalloutNV", nullptr, - R"(Software\Bethesda Softworks\FalloutNV)", "Installed Path", "Fallout New Vegas"}, + R"(Software\Bethesda Softworks\FalloutNV)", "installed path", "Fallout New Vegas"}, {"Morrowind", "22320", "1440163901", nullptr, "Morrowind", nullptr, nullptr, - R"(Software\Bethesda Softworks\Morrowind)", "Installed Path", "Morrowind"}, + R"(Software\Bethesda Softworks\Morrowind)", "installed path", "Morrowind"}, {"Oblivion", "22330", "1458058109", nullptr, "Oblivion", "Oblivion", nullptr, - R"(Software\Bethesda Softworks\Oblivion)", "Installed Path", "Oblivion"}, + R"(Software\Bethesda Softworks\Oblivion)", "installed path", "Oblivion"}, {"Skyrim", "72850", nullptr, nullptr, "Skyrim", "Skyrim", nullptr, - R"(Software\Bethesda Softworks\Skyrim)", "Installed Path", "Skyrim"}, + R"(Software\Bethesda Softworks\Skyrim)", "installed path", "Skyrim"}, {"Skyrim Special Edition", "489830", "1711230643", "ac82db5035584c7f8a2c548d98c86b2c", "Skyrim Special Edition", "Skyrim Special Edition", nullptr, - R"(Software\Bethesda Softworks\Skyrim Special Edition)", "Installed Path", + R"(Software\Bethesda Softworks\Skyrim Special Edition)", "installed path", "Skyrim Special Edition"}, {"Skyrim VR", "611670", nullptr, nullptr, "Skyrim VR", nullptr, nullptr, - R"(Software\Bethesda Softworks\Skyrim VR)", "Installed Path", "Skyrim VR"}, + R"(Software\Bethesda Softworks\Skyrim VR)", "installed path", "Skyrim VR"}, {"Starfield", "1716740", nullptr, nullptr, "Starfield", nullptr, nullptr, - R"(Software\Bethesda Softworks\Starfield)", "Installed Path", "Starfield"}, + R"(Software\Bethesda Softworks\Starfield)", "installed path", "Starfield"}, // CD Projekt RED Games {"The Witcher 3", "292030", "1495134320", nullptr, "The Witcher 3", nullptr, nullptr, diff --git a/src/src/organizercore.cpp b/src/src/organizercore.cpp index 330eeae..701e169 100644 --- a/src/src/organizercore.cpp +++ b/src/src/organizercore.cpp @@ -2316,8 +2316,17 @@ bool OrganizerCore::checkGameRegistryKey() registryPath = prefix.readHklmValue(wow64Key, valueName); } + // Normalize trailing separators before comparing — Steam writes paths with + // a trailing backslash, so the registry value may differ only in that. + auto stripTrailingSep = [](QString s) { + while (s.endsWith('\\') || s.endsWith('/')) + s.chop(1); + return s; + }; + if (registryPath.isEmpty() || - registryPath.compare(winePath, Qt::CaseInsensitive) != 0) { + stripTrailingSep(registryPath).compare(stripTrailingSep(winePath), + Qt::CaseInsensitive) != 0) { const QString displayRegPath = registryPath.isEmpty() ? tr("") : registryPath; diff --git a/src/src/prefixsetuprunner.cpp b/src/src/prefixsetuprunner.cpp index 81824e1..74d59bc 100644 --- a/src/src/prefixsetuprunner.cpp +++ b/src/src/prefixsetuprunner.cpp @@ -1306,7 +1306,10 @@ bool PrefixSetupRunner::stepGameDetection() const QString& rVal = game.registry_value; // Convert Linux path to Wine Z: drive path with escaped backslashes. + // Trailing backslash required — game launchers expect it (matches Steam's format). QString winePath = "Z:" + QString(installPath).replace('/', "\\\\"); + if (!winePath.endsWith("\\\\")) + winePath += "\\\\"; regContent += QStringLiteral( "[HKEY_LOCAL_MACHINE\\%1]\n\"%2\"=\"%3\"\n\n" -- cgit v1.3.1