aboutsummaryrefslogtreecommitdiff
path: root/libs/basic_games/games/game_divinityoriginalsinee.py
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
commit7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch)
tree27fb39be241fdb5ac2734c574de678977d1856d0 /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.py119
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