@@ -117,9 +117,6 @@ SaveGameGamebryo::~SaveGameGamebryo()
117117}
118118
119119
120-
121-
122-
123120void 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
176225void 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 ();
0 commit comments