aboutsummaryrefslogtreecommitdiff
path: root/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-04-23 16:09:59 -0500
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-04-23 16:09:59 -0500
commit96a6ba196c72e955c3db822d93da38fce8cd7045 (patch)
tree3fcc40e939bd609c4cb7b84f05e85875dde64fc6 /libs/game_bethesda/src/gamebryo/gamegamebryo.cpp
parent6b9f0876cfbf6f8c723c86ec941ee70933aa883f (diff)
Fix VFS rmdir, prefix/launch issues, add version + beta channel
- VFS: add mo2_rmdir + OverwriteManager::removeDirectory so Wrye Bash shutil.rmtree stops failing with WinError 267 (issue #47). - FileRenamer: case-insensitive fallback via new resolvePathCaseInsensitive walks each path component; bulk hide in Conflict tab no longer dies with a misleading "Input/output error" when DirectoryEntry normalised parent dir case (issue #54). formatSystemMessage stops aliasing Windows error code 5 to errno 5 (EIO). - Versioning: FLUORINE_VERSION_* + fluorine_build_info.h generated from CMake; Linux createVersionInfo returns Fluorine's version. About dialog shows Fluorine version + MO2 engine + commit. Beta builds stamp "<semver>B<yyyymmddhhmm>" (issue #51). - CI: ci.yml determines channel from ref (v* tags = stable, main = beta), publishes a rolling `beta` GitHub release whose body carries a machine-parseable fluorine-meta block (timestamp, commit) for the in-app updater. - Updater: new FluorineUpdater polls GitHub API on startup, compares against embedded metadata, notifies on new release without auto-install. Channel toggle piggybacks on the existing "beta versions" checkbox. - Bethesda plugins: determineMyGamesPath no longer creates Documents/My Games/<GameName> for every possible title at plugin load; only games with a detected install path get their dirs created (issue #55). - Starfield: dataDirectory() on Linux now points at <game>/Data instead of My Games/Starfield/Data so the single FUSE mount lands where SFSE loads plugins; My Games Data becomes a secondary symlinked mapping (issue #56). - Prefix resolution: prefer Fluorine config, then explicit fluorine/prefix_path, then legacy Settings/* keys (with a warning) so auto-detected Heroic/Bottles prefixes can't silently override a user- configured Fluorine prefix (issue #52). compatDataPathFromPrefix no longer hands Proton the wrong parent dir for plain wine prefixes. - xrandr: ensureXrandrInstalled back-fills the helper for existing SLR installs, prefix init runs it before wineboot, SLR wrap exposes xrandr-bin via --filesystem= and prepends PATH inside the container (issue #49). - Process tracking: drop the wineserver-as-last-resort fallback that made MO2 hang on Proton's session manager after game exit. Rescan the prefix for matching game executables instead (covers reparented launcher children like f4se_loader → Fallout4.exe). Unlock button now kills wineserver for the prefix (SIGTERM then SIGKILL on timeout). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'libs/game_bethesda/src/gamebryo/gamegamebryo.cpp')
-rw-r--r--libs/game_bethesda/src/gamebryo/gamegamebryo.cpp34
1 files changed, 25 insertions, 9 deletions
diff --git a/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp b/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp
index 9d29dcf..fc3ba8a 100644
--- a/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp
+++ b/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp
@@ -56,7 +56,7 @@ GameGamebryo::GameGamebryo() {}
void GameGamebryo::detectGame()
{
m_GamePath = identifyGamePath();
- m_MyGamesPath = determineMyGamesPath(gameName());
+ m_MyGamesPath = determineMyGamesPath(gameName(), !m_GamePath.isEmpty());
}
bool GameGamebryo::init(MOBase::IOrganizer* moInfo)
@@ -714,7 +714,8 @@ QString GameGamebryo::getSpecialPath(const QString& name)
}
#endif // _WIN32
-QString GameGamebryo::determineMyGamesPath(const QString& gameName)
+QString GameGamebryo::determineMyGamesPath(const QString& gameName,
+ bool createIfMissing)
{
const QString pattern = "%1/My Games/" + gameName;
@@ -781,21 +782,36 @@ QString GameGamebryo::determineMyGamesPath(const QString& gameName)
}
}
- // If no existing directory was found, try to create it in the configured prefix
- // so that the game launcher can populate it on first run.
+ // No existing directory found. By default we return the expected path
+ // (under the configured prefix) WITHOUT creating it — every Bethesda
+ // plugin constructs itself at startup, and pre-creating `My Games/<Game>`
+ // for every possible title (Fallout4, Oblivion, Morrowind, …) clutters
+ // the user's prefix with empty folders for games they don't have.
+ // See issue #55.
+ //
+ // Callers that actually need the directory (profile initialization,
+ // save writes, ini deployment) should mkpath on demand or pass
+ // createIfMissing=true explicitly.
if (!configuredPrefix.isEmpty()) {
const QString configuredDocs =
QDir(configuredPrefix).filePath("drive_c/users/steamuser/Documents");
const QString newPath = pattern.arg(configuredDocs);
- if (QDir().mkpath(newPath)) {
- MOBase::log::info("determineMyGamesPath: created '{}' for game '{}'", newPath,
- gameName);
+ if (createIfMissing) {
+ if (QDir().mkpath(newPath)) {
+ MOBase::log::info("determineMyGamesPath: created '{}' for game '{}'",
+ newPath, gameName);
+ return newPath;
+ }
+ } else {
+ // Return the expected path for reference; callers may check for
+ // existence before writing.
return newPath;
}
}
- MOBase::log::warn("determineMyGamesPath: could not find My Games path for '{}'",
- gameName);
+ MOBase::log::debug(
+ "determineMyGamesPath: no existing My Games path for '{}' (create=false)",
+ gameName);
#endif
return {};