aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/saveload.cpp
diff options
context:
space:
mode:
authorSven Hesse2008-05-11 18:55:40 +0000
committerSven Hesse2008-05-11 18:55:40 +0000
commitc5498a69bfaee74e2b5b046b36512c8a5d4785f9 (patch)
tree5af2b119460ce499b4e36cbb6195e688849c2f54 /engines/gob/saveload.cpp
parent4b21c2958ddf3cf1e69f427c715406d76712bed1 (diff)
downloadscummvm-rg350-c5498a69bfaee74e2b5b046b36512c8a5d4785f9.tar.gz
scummvm-rg350-c5498a69bfaee74e2b5b046b36512c8a5d4785f9.tar.bz2
scummvm-rg350-c5498a69bfaee74e2b5b046b36512c8a5d4785f9.zip
Implemented temp buffer saving/loading ("SAVE.TMP") in Woodruff.
Objects you take from or leave in screens are remembered correctly now. svn-id: r32030
Diffstat (limited to 'engines/gob/saveload.cpp')
-rw-r--r--engines/gob/saveload.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/engines/gob/saveload.cpp b/engines/gob/saveload.cpp
index e0854151a0..50f41db47e 100644
--- a/engines/gob/saveload.cpp
+++ b/engines/gob/saveload.cpp
@@ -433,6 +433,115 @@ bool StagedSave::read() {
}
+PagedBuffer::PagedBuffer(uint32 pageSize) {
+
+ _size = 0;
+ _pageSize = pageSize;
+}
+
+PagedBuffer::~PagedBuffer() {
+ clear();
+}
+
+bool PagedBuffer::empty() const {
+ return _pages.empty();
+}
+
+uint32 PagedBuffer::getSize() const {
+ return _size;
+}
+
+void PagedBuffer::clear() {
+ for (uint i = 0; i < _pages.size(); i++)
+ delete[] _pages[i];
+ _pages.clear();
+ _size = 0;
+}
+
+bool PagedBuffer::write(const byte *buffer, uint32 size, uint32 offset) {
+ grow(size, offset);
+
+ uint page = offset / _pageSize;
+ while (size > 0) {
+ if (!_pages[page])
+ _pages[page] = new byte[_pageSize];
+
+ uint32 pStart = offset % _pageSize;
+ uint32 n = MIN(size, _pageSize - pStart);
+
+ memcpy(_pages[page] + pStart, buffer, n);
+
+ buffer += n;
+ offset += n;
+ size -= n;
+ page++;
+ }
+
+ return true;
+}
+
+bool PagedBuffer::read(byte *buffer, uint32 size, uint32 offset) const {
+ uint page = offset / _pageSize;
+
+ while (size > 0) {
+ if (offset >= _size) {
+ memset(buffer, 0, size);
+ break;
+ }
+
+ uint32 pStart = offset % _pageSize;
+ uint32 n = MIN(MIN(size, _pageSize - pStart), _size - offset);
+
+ if (_pages[page])
+ memcpy(buffer, _pages[page] + pStart, n);
+ else
+ memset(buffer, 0, n);
+
+ buffer += n;
+ offset += n;
+ size -= n;
+ page++;
+ }
+
+ return true;
+}
+
+uint32 PagedBuffer::writeToStream(Common::WriteStream &out) const {
+ for (uint i = 0; i < _pages.size(); i++) {
+ if (!_pages[i]) {
+ for (uint32 j = 0; j < _pageSize; j++)
+ out.writeByte(0);
+ } else
+ out.write(_pages[i], _pageSize);
+ }
+
+ return _size;
+}
+
+uint32 PagedBuffer::readFromStream(Common::ReadStream &in) {
+ clear();
+
+ while (!in.eos()) {
+ byte *buffer = new byte[_pageSize];
+
+ _size += in.read(buffer, _pageSize);
+
+ _pages.push_back(buffer);
+ }
+
+ return _size;
+}
+
+void PagedBuffer::grow(uint32 size, uint32 offset) {
+ uint32 eSize = offset + size;
+
+ while (_size < eSize) {
+ _pages.push_back(0);
+ _size += MIN(_pageSize, eSize - _size);
+ }
+}
+
+
SaveLoad::SaveLoad(GobEngine *vm, const char *targetName) : _vm(vm) {
_targetName = new char[strlen(targetName) + 1];