aboutsummaryrefslogtreecommitdiff
path: root/libs/game_bethesda/src/games/oblivion/oblivionsavegame.cpp
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/game_bethesda/src/games/oblivion/oblivionsavegame.cpp
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/game_bethesda/src/games/oblivion/oblivionsavegame.cpp')
-rw-r--r--libs/game_bethesda/src/games/oblivion/oblivionsavegame.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/libs/game_bethesda/src/games/oblivion/oblivionsavegame.cpp b/libs/game_bethesda/src/games/oblivion/oblivionsavegame.cpp
new file mode 100644
index 0000000..2f26714
--- /dev/null
+++ b/libs/game_bethesda/src/games/oblivion/oblivionsavegame.cpp
@@ -0,0 +1,74 @@
+#include "oblivionsavegame.h"
+
+OblivionSaveGame::OblivionSaveGame(QString const& fileName, GameOblivion const* game)
+ : GamebryoSaveGame(fileName, game)
+{
+ FileWrapper file(getFilepath(), "TES4SAVEGAME");
+ file.setPluginString(GamebryoSaveGame::StringType::TYPE_BSTRING);
+
+ _SYSTEMTIME creationTime;
+ fetchInformationFields(file, m_SaveNumber, m_PCName, m_PCLevel, m_PCLocation,
+ creationTime);
+ setCreationTime(creationTime);
+}
+
+void OblivionSaveGame::fetchInformationFields(FileWrapper& file,
+ uint32_t& saveNumber,
+ QString& playerName,
+ unsigned short& playerLevel,
+ QString& playerLocation,
+ _SYSTEMTIME& creationTime) const
+{
+ file.skip<unsigned char>(); // Major version
+ file.skip<unsigned char>(); // Minor version
+
+ file.skip<_SYSTEMTIME>(); // exe last modified (!)
+
+ file.skip<uint32_t>(); // Header version
+ file.skip<uint32_t>(); // Header size
+
+ file.read(saveNumber);
+
+ file.read(playerName);
+ file.read(playerLevel);
+ file.read(playerLocation);
+
+ file.skip<float>(); // game days
+ file.skip<uint32_t>(); // game ticks
+
+ // there is a save time stored here. So use it rather than the file time, which
+ // could have been copied.
+ // Note: This says it uses getlocaltime api to obtain it which is u/s - if so
+ // we should ignore this.
+ file.read(creationTime);
+}
+
+std::unique_ptr<GamebryoSaveGame::DataFields> OblivionSaveGame::fetchDataFields() const
+{
+ FileWrapper file(getFilepath(), "TES4SAVEGAME");
+ file.setPluginString(GamebryoSaveGame::StringType::TYPE_BSTRING);
+
+ std::unique_ptr<DataFields> fields = std::make_unique<DataFields>();
+
+ {
+ QString dummyName, dummyLocation;
+ unsigned short dummyLevel;
+ uint32_t dummySaveNumber;
+ _SYSTEMTIME dummyTime;
+
+ fetchInformationFields(file, dummySaveNumber, dummyName, dummyLevel, dummyLocation,
+ dummyTime);
+ }
+
+ // Note that screenshot size, width, height and data are apparently the same
+ // structure
+ uint32_t imageSize;
+ file.read(imageSize); // Screenshot size.
+ if (imageSize > 0) {
+ fields->Screenshot = file.readImage();
+ }
+
+ fields->Plugins = file.readPlugins();
+
+ return fields;
+}