- read snapshots from zip.

This commit is contained in:
Christoph Oelckers 2016-09-22 01:28:05 +02:00
parent f93e4813d1
commit 5dfc396bb9
12 changed files with 90 additions and 76 deletions

View file

@ -1962,7 +1962,8 @@ void G_DoLoadGame ()
// dearchive all the modifications // dearchive all the modifications
level.time = Scale (time[1], TICRATE, time[0]); level.time = Scale (time[1], TICRATE, time[0]);
//G_ReadSnapshots(png); G_ReadSnapshots(resfile);
G_ReadVisited(arc);
// load a base level // load a base level
savegamerestore = true; // Use the player actors in the savegame savegamerestore = true; // Use the player actors in the savegame
@ -2268,8 +2269,8 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio
// delete the JSON buffers we created just above. Everything else will // delete the JSON buffers we created just above. Everything else will
// either still be needed or taken care of automatically. // either still be needed or taken care of automatically.
delete[] savegame_content[1].mBuffer; savegame_content[1].Clean();
delete[] savegame_content[2].mBuffer; savegame_content[2].Clean();
// Check whether the file is ok by trying to open it. // Check whether the file is ok by trying to open it.
FResourceFile *test = FResourceFile::OpenResourceFile(filename, nullptr, true); FResourceFile *test = FResourceFile::OpenResourceFile(filename, nullptr, true);

View file

@ -24,7 +24,6 @@
#define __G_GAME__ #define __G_GAME__
struct event_t; struct event_t;
struct PNGHandle;
// //

View file

@ -1,7 +1,6 @@
#ifndef __G_HUB_H #ifndef __G_HUB_H
#define __G_HUB_H #define __G_HUB_H
struct PNGHandle;
struct cluster_info_t; struct cluster_info_t;
struct wbstartstruct_t; struct wbstartstruct_t;
class FSerializer; class FSerializer;

View file

@ -1568,7 +1568,7 @@ void G_WriteSnapshots(TArray<FString> &filenames, TArray<FCompressedBuffer> &buf
{ {
if (wadlevelinfos[i].Snapshot.mCompressedSize > 0) if (wadlevelinfos[i].Snapshot.mCompressedSize > 0)
{ {
filename << wadlevelinfos[i].MapName << ".json"; filename << wadlevelinfos[i].MapName << ".map.json";
filename.ToLower(); filename.ToLower();
filenames.Push(filename); filenames.Push(filename);
buffers.Push(wadlevelinfos[i].Snapshot); buffers.Push(wadlevelinfos[i].Snapshot);
@ -1576,7 +1576,7 @@ void G_WriteSnapshots(TArray<FString> &filenames, TArray<FCompressedBuffer> &buf
} }
if (TheDefaultLevelInfo.Snapshot.mCompressedSize > 0) if (TheDefaultLevelInfo.Snapshot.mCompressedSize > 0)
{ {
filename << TheDefaultLevelInfo.MapName << ".json"; filename << TheDefaultLevelInfo.MapName << ".mapd.json";
filename.ToLower(); filename.ToLower();
filenames.Push(filename); filenames.Push(filename);
buffers.Push(TheDefaultLevelInfo.Snapshot); buffers.Push(TheDefaultLevelInfo.Snapshot);
@ -1629,45 +1629,48 @@ void G_WriteVisited(FSerializer &arc)
// //
//========================================================================== //==========================================================================
void G_ReadSnapshots(PNGHandle *png) void G_ReadSnapshots(FResourceFile *resf)
{ {
DWORD chunkLen;
FString MapName; FString MapName;
level_info_t *i; level_info_t *i;
G_ClearSnapshots(); G_ClearSnapshots();
chunkLen = (DWORD)M_FindPNGChunk(png, SNAP_ID); for (unsigned j = 0; j < resf->LumpCount(); j++)
while (chunkLen != 0)
{ {
#if 0 FResourceLump * resl = resf->GetLump(j);
FPNGChunkArchive arc(png->File->GetFile(), SNAP_ID, chunkLen); if (resl != nullptr)
DWORD snapver; {
auto ptr = strstr(resl->FullName, ".map.json");
arc << snapver; if (ptr != nullptr)
arc << MapName; {
i = FindLevelInfo(MapName); ptrdiff_t maplen = ptr - resl->FullName.GetChars();
i->snapshot = new FCompressedMemFile; FString mapname(resl->FullName.GetChars(), (size_t)maplen);
i->snapshot->Serialize(arc); i = FindLevelInfo(mapname);
chunkLen = (DWORD)M_NextPNGChunk(png, SNAP_ID); if (i != nullptr)
#endif {
} i->Snapshot = resl->GetRawData();
}
chunkLen = (DWORD)M_FindPNGChunk(png, DSNP_ID); }
if (chunkLen != 0) else
{ {
#if 0 auto ptr = strstr(resl->FullName, ".mapd.json");
FPNGChunkArchive arc(png->File->GetFile(), DSNP_ID, chunkLen); if (ptr != nullptr)
DWORD snapver; {
ptrdiff_t maplen = ptr - resl->FullName.GetChars();
arc << snapver; FString mapname(resl->FullName.GetChars(), (size_t)maplen);
arc << MapName; TheDefaultLevelInfo.Snapshot = resl->GetRawData();
TheDefaultLevelInfo.snapshot = new FCompressedMemFile; }
TheDefaultLevelInfo.snapshot->Serialize(arc); }
#endif }
} }
} }
//==========================================================================
//
//
//==========================================================================
void G_ReadVisited(FSerializer &arc) void G_ReadVisited(FSerializer &arc)
{ {
if (arc.BeginArray("visited")) if (arc.BeginArray("visited"))
@ -1696,6 +1699,9 @@ void G_ReadVisited(FSerializer &arc)
} }
} }
//==========================================================================
//
//
//========================================================================== //==========================================================================
CCMD(listsnapshots) CCMD(listsnapshots)
@ -1752,7 +1758,6 @@ void P_WriteACSDefereds (FSerializer &arc)
void P_ReadACSDefereds (FSerializer &arc) void P_ReadACSDefereds (FSerializer &arc)
{ {
FString MapName; FString MapName;
size_t chunklen;
P_RemoveDefereds (); P_RemoveDefereds ();

View file

@ -532,8 +532,7 @@ void G_ClearSnapshots (void);
void P_RemoveDefereds (); void P_RemoveDefereds ();
void G_SnapshotLevel (void); void G_SnapshotLevel (void);
void G_UnSnapshotLevel (bool keepPlayers); void G_UnSnapshotLevel (bool keepPlayers);
struct PNGHandle; void G_ReadSnapshots (FResourceFile *);
void G_ReadSnapshots (PNGHandle *png);
void G_WriteSnapshots (TArray<FString> &, TArray<FCompressedBuffer> &); void G_WriteSnapshots (TArray<FString> &, TArray<FCompressedBuffer> &);
void G_WriteVisited(FSerializer &arc); void G_WriteVisited(FSerializer &arc);
void G_ReadVisited(FSerializer &arc); void G_ReadVisited(FSerializer &arc);

View file

@ -39,7 +39,6 @@
#include "basictypes.h" #include "basictypes.h"
#include "sfmt/SFMT.h" #include "sfmt/SFMT.h"
struct PNGHandle;
class FSerializer; class FSerializer;
class FRandom class FRandom

View file

@ -45,7 +45,6 @@
class FFont; class FFont;
class FileReader; class FileReader;
struct line_t; struct line_t;
struct PNGHandle;
enum enum

View file

@ -34,7 +34,6 @@
#ifndef __P_SAVEG_H__ #ifndef __P_SAVEG_H__
#define __P_SAVEG_H__ #define __P_SAVEG_H__
struct PNGHandle;
class FSerializer; class FSerializer;
// Persistent storage/archiving. // Persistent storage/archiving.

View file

@ -306,17 +306,12 @@ FZipFile::~FZipFile()
// //
//========================================================================== //==========================================================================
FCompressedBuffer FZipFile::GetRawLump(int lumpnum) FCompressedBuffer FZipLump::GetRawData()
{ {
if ((unsigned)lumpnum >= NumLumps) FCompressedBuffer cbuf = { (unsigned)LumpSize, (unsigned)CompressedSize, Method, GPFlags, CRC32, new char[CompressedSize] };
{ if (Flags & LUMPFZIP_NEEDFILESTART) SetLumpAddress();
return{ 0,0,0,0,0,nullptr }; Owner->Reader->Seek(Position, SEEK_SET);
} Owner->Reader->Read(cbuf.mBuffer, CompressedSize);
FZipLump *lmp = &Lumps[lumpnum];
FCompressedBuffer cbuf = { (unsigned)lmp->LumpSize, (unsigned)lmp->CompressedSize, lmp->Method, lmp->GPFlags, lmp->CRC32, new char[lmp->CompressedSize] };
Reader->Seek(lmp->Position, SEEK_SET);
Reader->Read(cbuf.mBuffer, lmp->CompressedSize);
return cbuf; return cbuf;
} }

View file

@ -3,28 +3,6 @@
#include "resourcefile.h" #include "resourcefile.h"
// This holds a compresed Zip entry with all needed info to decompress it.
struct FCompressedBuffer
{
unsigned mSize;
unsigned mCompressedSize;
int mMethod;
int mZipFlags;
unsigned mCRC32;
char *mBuffer;
bool Decompress(char *destbuffer);
void Clean()
{
mSize = mCompressedSize = 0;
if (mBuffer != nullptr)
{
delete[] mBuffer;
mBuffer = nullptr;
}
}
};
enum enum
{ {
LUMPFZIP_NEEDFILESTART = 128 LUMPFZIP_NEEDFILESTART = 128
@ -50,6 +28,7 @@ struct FZipLump : public FResourceLump
private: private:
void SetLumpAddress(); void SetLumpAddress();
virtual int GetFileOffset(); virtual int GetFileOffset();
FCompressedBuffer GetRawData();
}; };
@ -68,7 +47,6 @@ public:
virtual ~FZipFile(); virtual ~FZipFile();
bool Open(bool quiet); bool Open(bool quiet);
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; } virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
FCompressedBuffer GetRawLump(int lumpnum);
}; };

View file

@ -40,6 +40,7 @@
#include "doomerrors.h" #include "doomerrors.h"
#include "gi.h" #include "gi.h"
#include "doomstat.h" #include "doomstat.h"
#include "w_zip.h"
//========================================================================== //==========================================================================
@ -191,6 +192,23 @@ void FResourceLump::CheckEmbedded()
} }
//==========================================================================
//
// this is just for completeness. For non-Zips only an uncompressed lump can
// be returned.
//
//==========================================================================
FCompressedBuffer FResourceLump::GetRawData()
{
FCompressedBuffer cbuf = { (unsigned)LumpSize, (unsigned)LumpSize, METHOD_STORED, 0, 0, new char[LumpSize] };
memcpy(cbuf.mBuffer, CacheLump(), LumpSize);
cbuf.mCRC32 = crc32(0, (BYTE*)cbuf.mBuffer, LumpSize);
ReleaseCache();
return cbuf;
}
//========================================================================== //==========================================================================
// //
// Returns the owner's FileReader if it can be used to access this lump // Returns the owner's FileReader if it can be used to access this lump

View file

@ -8,6 +8,28 @@
class FResourceFile; class FResourceFile;
class FTexture; class FTexture;
// This holds a compresed Zip entry with all needed info to decompress it.
struct FCompressedBuffer
{
unsigned mSize;
unsigned mCompressedSize;
int mMethod;
int mZipFlags;
unsigned mCRC32;
char *mBuffer;
bool Decompress(char *destbuffer);
void Clean()
{
mSize = mCompressedSize = 0;
if (mBuffer != nullptr)
{
delete[] mBuffer;
mBuffer = nullptr;
}
}
};
struct FResourceLump struct FResourceLump
{ {
friend class FResourceFile; friend class FResourceFile;
@ -46,6 +68,7 @@ struct FResourceLump
virtual int GetIndexNum() const { return 0; } virtual int GetIndexNum() const { return 0; }
void LumpNameSetup(FString iname); void LumpNameSetup(FString iname);
void CheckEmbedded(); void CheckEmbedded();
virtual FCompressedBuffer GetRawData();
void *CacheLump(); void *CacheLump();
int ReleaseCache(); int ReleaseCache();