Skip to content

Commit 9945b5e

Browse files
committed
added support for fallout 4 savegames
1 parent dbbd0c4 commit 9945b5e

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

src/savegamegamebryo.cpp

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,6 @@ SaveGameGamebryo::~SaveGameGamebryo()
117117
}
118118

119119

120-
121-
122-
123120
void SaveGameGamebryo::readSkyrimFile(QFile &saveFile)
124121
{
125122
char fileID[14];
@@ -172,6 +169,58 @@ void SaveGameGamebryo::readSkyrimFile(QFile &saveFile)
172169
}
173170
}
174171

172+
void SaveGameGamebryo::readFO4File(QFile &saveFile)
173+
{
174+
char fileID[13];
175+
176+
saveFile.read(fileID, 12);
177+
fileID[12] = '\0';
178+
if (strncmp(fileID, "FO4_SAVEGAME", 12) != 0) {
179+
throw std::runtime_error(QObject::tr("wrong file format").toUtf8().constData());
180+
}
181+
182+
FileSkip<unsigned long>(saveFile); // header size
183+
FileSkip<unsigned long>(saveFile); // header version, -> 11
184+
FileRead(saveFile, m_SaveNumber);
185+
186+
m_PCName = ReadFOSString(saveFile, false);
187+
188+
unsigned long temp;
189+
FileRead(saveFile, temp); // player level
190+
m_PCLevel = static_cast<unsigned short>(temp);
191+
192+
m_PCLocation = ReadFOSString(saveFile, false);
193+
ReadFOSString(saveFile, false); // playtime as ascii hhh.mm.ss
194+
ReadFOSString(saveFile, false); // race name (HumanRace)
195+
196+
197+
FileSkip<unsigned short>(saveFile); // ???
198+
FileSkip<float>(saveFile, 2); // ???
199+
FileSkip<unsigned char>(saveFile, 8); // filetime
200+
201+
// FileSkip<unsigned char>(saveFile, 18); // ??? 18 bytes of data. not completely random, maybe a time stamp? maybe
202+
203+
unsigned long width, height;
204+
FileRead(saveFile, width); // 640
205+
FileRead(saveFile, height); // 384
206+
207+
QScopedArrayPointer<unsigned char> buffer(new unsigned char[width * height * 4]);
208+
saveFile.read(reinterpret_cast<char*>(buffer.data()), width * height * 4);
209+
// 640x384 is a bit large
210+
m_Screenshot = QImage(buffer.data(), width, height, QImage::Format_RGBA8888).scaledToWidth(320);
211+
212+
FileSkip<unsigned char>(saveFile); // form version (?)
213+
ReadFOSString(saveFile, false); // game version
214+
FileSkip<unsigned long>(saveFile); // plugin info size (?)
215+
216+
unsigned char pluginCount;
217+
FileRead(saveFile, pluginCount);
218+
219+
for (int i = 0; i < pluginCount; ++i) {
220+
m_Plugins.push_back(ReadFOSString(saveFile, false));
221+
}
222+
}
223+
175224

176225
void SaveGameGamebryo::readESSFile(QFile &saveFile)
177226
{
@@ -332,6 +381,10 @@ void SaveGameGamebryo::readFile(const QString &fileName)
332381
setCreationTime(fileName);
333382
readSkyrimFile(saveFile);
334383
} break;
384+
case GameInfo::TYPE_FALLOUT4: {
385+
setCreationTime(fileName);
386+
readFO4File(saveFile);
387+
} break;
335388
}
336389

337390
saveFile.close();

src/savegamegamebyro.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ Q_OBJECT
8585

8686
void readESSFile(QFile &saveFile);
8787
void readFOSFile(QFile &saveFile, bool newVegas);
88+
void readFO4File(QFile &saveFile);
8889
void readSkyrimFile(QFile &saveFile);
8990

9091
void setCreationTime(const QString &fileName);

src/transfersavesdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ void TransferSavesDialog::refreshLocalSaves()
7777

7878
QStringList files = savesDir.entryList(QDir::Files, QDir::Time);
7979

80-
foreach (const QString &filename, files) {
80+
for (const QString &filename : files) {
8181
SaveGameGamebryo *save = new SaveGameGamebryo(this, savesDir.absoluteFilePath(filename));
8282
save->setParent(this);
8383
m_LocalSaves.push_back(save);

0 commit comments

Comments
 (0)