aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/savefile.h
blob: 529be377b5216aec253c67022880cc4e8c6a1bcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef BLADERUNNER_SAVEFILE_H
#define BLADERUNNER_SAVEFILE_H

#include "common/array.h"
#include "common/memstream.h"
#include "common/savefile.h"
#include "common/types.h"

#include "graphics/surface.h"

#include "engines/savestate.h"

namespace Common {
class OutSaveFile;
class String;
struct Rect;
}

namespace BladeRunner {

class Vector2;
class Vector3;
class BoundingBox;


struct SaveFileHeader {
	uint8              _version;
	Common::String     _name;
	int                _year;
	int                _month;
	int                _day;
	int                _hour;
	int                _minute;
	Graphics::Surface *_thumbnail;
};

class SaveFileManager {
private:
	static const uint32 kTag = MKTAG('B', 'R', 'S', 'V');
	static const uint32 kVersion = 1;

public:
	static const uint32 kNameLength = 32;
	static const uint32 kThumbnailSize = 9600; // 80x60x16bpp

	static SaveStateList list(const Common::String &target);
	static SaveStateDescriptor queryMetaInfos(const Common::String &target, int slot);

	static Common::InSaveFile *openForLoading(const Common::String &target, int slot);
	static Common::OutSaveFile *openForSaving(const Common::String &target, int slot);

	static void remove(const Common::String &target, int slot);

	static bool readHeader(Common::SeekableReadStream &in, SaveFileHeader &header, bool skipThumbnail = true);
	static bool writeHeader(Common::WriteStream &out, SaveFileHeader &header);

};

class SaveFileWriteStream : public Common::WriteStream {
private:
	Common::WriteStream &_s;

public:
	SaveFileWriteStream(Common::WriteStream &s);

	uint32 write(const void *dataPtr, uint32 dataSize) override { return _s.write(dataPtr, dataSize); }
	bool flush() override { return _s.flush(); }
	int32 pos() const override { return _s.pos(); }

	void debug(char *p);

	void padBytes(int count);

	void writeInt(int v);
	void writeFloat(float v);
	void writeBool(bool v);
	void writeStringSz(const Common::String &s, uint sz);
	void writeVector2(const Vector2 &v);
	void writeVector3(const Vector3 &v);
	void writeRect(const Common::Rect &v);
	void writeBoundingBox(const BoundingBox &v, bool serialized);
};

class SaveFileReadStream : public Common::SeekableReadStream {
private:
	Common::SeekableReadStream &_s;

public:
	SaveFileReadStream(Common::SeekableReadStream &s);

	bool eos() const override { return _s.eos(); }
	uint32 read(void *dataPtr, uint32 dataSize) override { return _s.read(dataPtr, dataSize); }
	int32 pos() const override { return _s.pos(); }
	int32 size() const override { return _s.size(); }
	bool seek(int32 offset, int whence = SEEK_SET) override { return _s.seek(offset, whence); }

	int readInt();
	float readFloat();
	bool readBool();
	Common::String readStringSz(uint sz);
	Vector2 readVector2();
	Vector3 readVector3();
	Common::Rect readRect();
	BoundingBox readBoundingBox(bool serialized);
};

} // End of namespace BladeRunner

#endif