diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
| commit | 7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch) | |
| tree | 27fb39be241fdb5ac2734c574de678977d1856d0 /libs/basic_games/games/game_divinityoriginalsinee.py | |
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem,
Proton/umu-run integration, and Flatpak packaging.
Key features:
- FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak)
- Proton/GE-Proton/umu-run launcher with env var forwarding
- Flatpak support (sandbox-aware VFS, NXM handler, umu-run)
- Wine prefix management UI
- Case-insensitive path resolution for Linux filesystems
- QSettings-safe INI handling (avoids Bethesda INI corruption)
- Portable instance support with auto-generated launcher scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/basic_games/games/game_divinityoriginalsinee.py')
| -rw-r--r-- | libs/basic_games/games/game_divinityoriginalsinee.py | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/libs/basic_games/games/game_divinityoriginalsinee.py b/libs/basic_games/games/game_divinityoriginalsinee.py new file mode 100644 index 0000000..fd3836f --- /dev/null +++ b/libs/basic_games/games/game_divinityoriginalsinee.py @@ -0,0 +1,119 @@ +# -*- encoding: utf-8 -*- + +import os +from pathlib import Path + +import mobase + +from ..basic_features import BasicGameSaveGameInfo +from ..basic_game import BasicGame + + +class DivinityOriginalSinEnhancedEditionModDataChecker(mobase.ModDataChecker): + def __init__(self): + super().__init__() + + def dataLooksValid( + self, filetree: mobase.IFileTree + ) -> mobase.ModDataChecker.CheckReturn: + folders: list[mobase.IFileTree] = [] + files: list[mobase.FileTreeEntry] = [] + + for entry in filetree: + if isinstance(entry, mobase.IFileTree): + folders.append(entry) + else: + files.append(entry) + + VALID_FOLDERS = [ + "Cursors", + "DLC", + "Engine", + "Fonts", + "Localization", + "PakInfo", + "PlayerProfiles", + "Public", + "Shaders", + DivinityOriginalSinEnhancedEditionGame.DOCS_MOD_SPECIAL_NAME, + ] + for src_folder in folders: + for dst_folder in VALID_FOLDERS: + if src_folder.name().lower() == dst_folder.lower(): + return mobase.ModDataChecker.VALID + + VALID_FILE_EXTENSIONS = [ + ".pak", + ] + for src_file in files: + for extension in VALID_FILE_EXTENSIONS: + if src_file.name().lower().endswith(extension.lower()): + return mobase.ModDataChecker.VALID + + return mobase.ModDataChecker.INVALID + + +class DivinityOriginalSinEnhancedEditionGame(BasicGame, mobase.IPluginFileMapper): + Name = "Divinity: Original Sin (Enhanced Edition) Support Plugin" + Author = "LostDragonist" + Version = "1.0.0" + + GameName = "Divinity: Original Sin (Enhanced Edition)" + GameShortName = "divinityoriginalsinenhancededition" + GameNexusName = "divinityoriginalsinenhancededition" + GameValidShortNames = ["divinityoriginalsin"] + GameNexusId = 1995 + GameSteamId = [373420] + GameGogId = [1445516929, 1445524575] + GameBinary = "Shipping/EoCApp.exe" + GameDataPath = "Data" + GameSaveExtension = "lsv" + GameDocumentsDirectory = ( + "%USERPROFILE%/Documents/Larian Studios/Divinity Original Sin Enhanced Edition" + ) + GameSavesDirectory = ( + "%USERPROFILE%/Documents/Larian Studios/" + "Divinity Original Sin Enhanced Edition/PlayerProfiles" + ) + GameSupportURL = ( + r"https://github.com/ModOrganizer2/modorganizer-basic_games/wiki/" + "Game:-Divinity:-Original-Sin" + ) + + DOCS_MOD_SPECIAL_NAME = "DOCS_MOD" + + def __init__(self): + BasicGame.__init__(self) + mobase.IPluginFileMapper.__init__(self) + + def init(self, organizer: mobase.IOrganizer): + super().init(organizer) + self._register_feature(BasicGameSaveGameInfo(lambda s: s.with_suffix(".png"))) + self._register_feature(DivinityOriginalSinEnhancedEditionModDataChecker()) + return True + + def mappings(self) -> list[mobase.Mapping]: + map: list[mobase.Mapping] = [] + modDirs = self._listDirsRecursive(Path(self.DOCS_MOD_SPECIAL_NAME)) + for dir_ in modDirs: + for file_ in self._organizer.findFiles(path=dir_, filter=lambda x: True): + m = mobase.Mapping() + m.createTarget = True + m.isDirectory = False + m.source = file_ + m.destination = os.path.join( + self.documentsDirectory().absoluteFilePath("Mods"), + file_.split(self.DOCS_MOD_SPECIAL_NAME)[1].strip("\\").strip("/"), + ) + map.append(m) + return map + + def primarySources(self): + return self.GameValidShortNames + + def _listDirsRecursive(self, prefix: Path) -> list[str]: + res = [str(prefix)] + dirs = self._organizer.listDirectories(str(prefix)) + for dir_ in dirs: + res.extend(self._listDirsRecursive(prefix.joinpath(dir_))) + return res |
