From d226c68de9a858a372c5e9a6e83d72dac676559f Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Fri, 3 Apr 2026 10:50:22 -0500 Subject: Fix cabextract not found in pressure-vessel and TTW game detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cabextract: The system binary under /usr is invisible inside the pressure-vessel container where winetricks runs. Always download a local copy to ~/.local/share/fluorine/bin/ instead of short-circuiting when the host has it installed. TTW: The game plugin was calling the base class identifyGamePath() which tried matching "TTW" against NaK's detected game names — never matching "Fallout New Vegas". Now explicitly searches for FNV in the NaK results, mirroring how the Windows path uses the FalloutNV registry key. Also adds HAS_NAK_FFI and nak_ffi linkage to the TTW CMake target since it was previously only defined for the game_gamebryo target. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../game_bethesda/src/games/ttw/gamefalloutttw.cpp | 27 ++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'libs/game_bethesda/src/*.cpp') diff --git a/libs/game_bethesda/src/games/ttw/gamefalloutttw.cpp b/libs/game_bethesda/src/games/ttw/gamefalloutttw.cpp index 3ffa5a1..cfd8ca8 100644 --- a/libs/game_bethesda/src/games/ttw/gamefalloutttw.cpp +++ b/libs/game_bethesda/src/games/ttw/gamefalloutttw.cpp @@ -15,6 +15,11 @@ #include #include +#ifdef HAS_NAK_FFI +#include +#include "scopeguard.h" +#endif + #include #include #include @@ -80,8 +85,26 @@ QString GameFalloutTTW::identifyGamePath() const QString path = "Software\\Bethesda Softworks\\FalloutNV"; result = findInRegistry(HKEY_LOCAL_MACHINE, path.toStdWString().c_str(), L"Installed Path"); -#else - result = GameGamebryo::identifyGamePath(); +#elif defined(HAS_NAK_FFI) + // TTW uses FalloutNV as its base game, so look for Fallout New Vegas + // (the base class would try matching "TTW" which NaK doesn't know about) + NakGameList gameList = nak_detect_all_games(); + ON_BLOCK_EXIT([&]() { + nak_game_list_free(gameList); + }); + + for (size_t i = 0; i < gameList.count; ++i) { + const NakGame& game = gameList.games[i]; + QString detectedName = QString::fromUtf8(game.name); + if (detectedName.contains("Fallout", Qt::CaseInsensitive) && + detectedName.contains("Vegas", Qt::CaseInsensitive)) { + QString detectedPath = QString::fromUtf8(game.install_path); + if (looksValid(QDir(detectedPath))) { + result = detectedPath; + break; + } + } + } #endif // EPIC Game Store if (result.isEmpty()) { -- cgit v1.3.1