diff options
Diffstat (limited to 'engines/bladerunner/savefile.cpp')
-rw-r--r-- | engines/bladerunner/savefile.cpp | 92 |
1 files changed, 79 insertions, 13 deletions
diff --git a/engines/bladerunner/savefile.cpp b/engines/bladerunner/savefile.cpp index 3528a6bb82..b0fb1e7fd6 100644 --- a/engines/bladerunner/savefile.cpp +++ b/engines/bladerunner/savefile.cpp @@ -27,13 +27,76 @@ #include "common/rect.h" #include "common/savefile.h" +#include "common/system.h" + +#include "graphics/thumbnail.h" namespace BladeRunner { -SaveFileWriteStream::SaveFileWriteStream() - : MemoryWriteStreamDynamic(DisposeAfterUse::YES) { +bool SaveFile::readHeader(Common::SeekableReadStream &in, SaveFileHeader &header, bool skipThumbnail) { + SaveFileReadStream s(in); + + if (s.readUint32BE() != kTag) { + warning("No header found in save file"); + return false; + } + + header._version = s.readByte(); + if (header._version != kVersion) { + warning("Unsupported version of save file %u, supported is %u", header._version, kVersion); + return false; + } + + header._name = s.readStringSz(kNameLength); + + header._year = s.readUint16LE(); + header._month = s.readUint16LE(); + header._day = s.readUint16LE(); + header._hour = s.readUint16LE(); + header._minute = s.readUint16LE(); + + header._thumbnail = nullptr; + + if (!skipThumbnail) { + header._thumbnail = new Graphics::Surface(); + + int32 pos = s.pos(); + + s.skip(4); //skip size; + + void *thumbnailData = new byte[kThumbnailSize]; + s.read(thumbnailData, kThumbnailSize); + + // TODO: cleanup - remove magic constants + header._thumbnail->init(80, 60, 160, thumbnailData, Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)); + + s.seek(pos); + } + + return true; +} + +bool SaveFile::writeHeader(Common::WriteStream &out, SaveFileHeader &header) { + SaveFileWriteStream s(out); + + s.writeUint32BE(kTag); + s.writeByte(kVersion); + + s.writeStringSz(header._name, kNameLength); + + TimeDate td; + g_system->getTimeAndDate(td); + s.writeUint16LE(td.tm_year + 1900); + s.writeUint16LE(td.tm_mon + 1); + s.writeUint16LE(td.tm_mday); + s.writeUint16LE(td.tm_hour); + s.writeUint16LE(td.tm_min); + + return true; } +SaveFileWriteStream::SaveFileWriteStream(Common::WriteStream &s) : _s(s) {} + void SaveFileWriteStream::debug(char *p) { write(p, strlen(p) + 1); } @@ -48,7 +111,7 @@ void SaveFileWriteStream::writeInt(int v) { writeUint32LE(v); } -void SaveFileWriteStream::writeFloat(int v) { +void SaveFileWriteStream::writeFloat(float v) { writeFloatLE(v); } @@ -80,7 +143,7 @@ void SaveFileWriteStream::writeRect(const Common::Rect &v) { writeUint32LE(v.bottom); } -void SaveFileWriteStream::writeBoundingBox(const BoundingBox &v) { +void SaveFileWriteStream::writeBoundingBox(const BoundingBox &v, bool serialized) { float x0, y0, z0, x1, y1, z1; v.getXYZ(&x0, &y0, &z0, &x1, &y1, &z1); @@ -92,14 +155,13 @@ void SaveFileWriteStream::writeBoundingBox(const BoundingBox &v) { writeFloatLE(z1); // Bounding boxes have a lot of extra data that's never actually used - for (int i = 0; i != 96; ++i) { + int count = serialized ? 96 : 64; + for (int i = 0; i < count; ++i) { writeFloatLE(0.0f); } } -SaveFileReadStream::SaveFileReadStream(const byte *dataPtr, uint32 dataSize) - : MemoryReadStream(dataPtr, dataSize, DisposeAfterUse::YES) { -} +SaveFileReadStream::SaveFileReadStream(Common::SeekableReadStream &s) : _s(s) {} int SaveFileReadStream::readInt() { return readUint32LE(); @@ -114,10 +176,10 @@ bool SaveFileReadStream::readBool() { } Common::String SaveFileReadStream::readStringSz(int sz) { - char *buf = (char *)malloc(sz); + char *buf = new char[sz]; read(buf, sz); Common::String result = buf; - free(buf); + delete[] buf; return result; } @@ -145,18 +207,22 @@ Common::Rect SaveFileReadStream::readRect() { return result; } -BoundingBox SaveFileReadStream::readBoundingBox() { +BoundingBox SaveFileReadStream::readBoundingBox(bool serialized) { float x0, y0, z0, x1, y1, z1; x0 = readFloatLE(); y0 = readFloatLE(); z0 = readFloatLE(); + x1 = readFloatLE(); y1 = readFloatLE(); z1 = readFloatLE(); - // Bounding boxes have a lot of extra data that's never actually used - skip(384); + // Bounding boxes have a lot of extra data that's never actually used, and there two formats for storing bounding boxes. + int count = serialized ? 96 : 64; + for (int i = 0; i < count; ++i) { + readFloatLE(); + } return BoundingBox(x0, y0, z0, x1, y1, z1); } |