diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-04-03 10:50:22 -0500 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-04-03 10:50:22 -0500 |
| commit | d226c68de9a858a372c5e9a6e83d72dac676559f (patch) | |
| tree | 947daff1835b5ef8946ecfc34cd598dd76c04ef2 /libs | |
| parent | 1ce8f010b6e99bd425f6fa74b87936ee3f8f3339 (diff) | |
Fix cabextract not found in pressure-vessel and TTW game detection
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) <noreply@anthropic.com>
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/game_bethesda/src/games/ttw/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | libs/game_bethesda/src/games/ttw/gamefalloutttw.cpp | 27 | ||||
| -rw-r--r-- | libs/nak/src/deps/tools.rs | 21 |
3 files changed, 39 insertions, 16 deletions
diff --git a/libs/game_bethesda/src/games/ttw/CMakeLists.txt b/libs/game_bethesda/src/games/ttw/CMakeLists.txt index 27149ec..828b67f 100644 --- a/libs/game_bethesda/src/games/ttw/CMakeLists.txt +++ b/libs/game_bethesda/src/games/ttw/CMakeLists.txt @@ -17,4 +17,11 @@ add_library(game_ttw SHARED mo2_configure_plugin(game_ttw NO_SOURCES WARNINGS 4) mo2_default_source_group() target_link_libraries(game_ttw PRIVATE game_gamebryo) + +# NaK FFI for TTW game detection (TTW uses FalloutNV as base game) +if(TARGET mo2::nak_ffi) + target_link_libraries(game_ttw PRIVATE mo2::nak_ffi) + target_compile_definitions(game_ttw PRIVATE HAS_NAK_FFI) +endif() + mo2_install_plugin(game_ttw) 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 <gamebryosavegameinfo.h> #include <gamebryounmanagedmods.h> +#ifdef HAS_NAK_FFI +#include <nak_ffi.h> +#include "scopeguard.h" +#endif + #include <QCoreApplication> #include <QDir> #include <QFileInfo> @@ -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()) { diff --git a/libs/nak/src/deps/tools.rs b/libs/nak/src/deps/tools.rs index 0e3e356..03dbe9a 100644 --- a/libs/nak/src/deps/tools.rs +++ b/libs/nak/src/deps/tools.rs @@ -105,19 +105,12 @@ pub fn ensure_winetricks() -> Result<PathBuf, Box<dyn Error>> { const CABEXTRACT_URL: &str = "https://github.com/SulfurNitride/NaK/releases/download/Cabextract/cabextract-linux-x86_64.zip"; -/// Ensures cabextract is available (either system or downloaded). +/// Ensures cabextract is available in our bin directory. +/// +/// Always downloads to ~/.local/share/fluorine/bin/ because winetricks runs +/// inside pressure-vessel where system binaries under /usr are not visible. pub fn ensure_cabextract() -> Result<PathBuf, Box<dyn Error>> { - // First check if system has cabextract - if Command::new("which") - .arg("cabextract") - .output() - .map(|o| o.status.success()) - .unwrap_or(false) - { - return Ok(PathBuf::from("cabextract")); - } - - // Check if we already downloaded it + // Check if we already downloaded it to our bin dir let bin_dir = get_nak_bin_path(); let cabextract_path = bin_dir.join("cabextract"); @@ -125,8 +118,8 @@ pub fn ensure_cabextract() -> Result<PathBuf, Box<dyn Error>> { return Ok(cabextract_path); } - // Download cabextract zip - log_warning("System cabextract not found, downloading..."); + // Download cabextract zip — system copy is unusable inside pressure-vessel + log_info("Downloading cabextract for use inside container..."); fs::create_dir_all(&bin_dir)?; let response = ureq::get(CABEXTRACT_URL).call().map_err(|e| { |
