aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/save/savehandler.h
blob: afc31f54f1b530a72218573a11ce5c84797ed120 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/* 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 GOB_SAVE_SAVEHANDLER_H
#define GOB_SAVE_SAVEHANDLER_H

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

#include "engines/gob/video.h" // for SurfacePtr

namespace Gob {

class GobEngine;
class SavePartInfo;
class SavePartVars;
class SavePartSprite;
class SaveConverter;

/** Slot file related class. */
class SlotFile {
public:
	/** The constructor.
	 *
	 *  @param slotCount Number of slots.
	 *  @param base The file's base string.
	 */
	SlotFile(GobEngine *vm, uint32 slotCount, const Common::String &base);
	virtual ~SlotFile();

	/** Calculates which slot to use. */
	virtual int getSlot(int32 offset) const = 0;
	/** Calculates the slot remainder, for error checking. */
	virtual int getSlotRemainder(int32 offset) const = 0;

protected:
	GobEngine *_vm;
	Common::String _base;

	uint32 _slotCount;
};

/** An indexed slot file ("foobar.s00", "foobar.s01", ...). */
class SlotFileIndexed : public SlotFile {
public:
	SlotFileIndexed(GobEngine *vm, uint32 slotCount, const Common::String &base,
			const Common::String &extStub);
	~SlotFileIndexed();

	/** Build the save file name. */
	Common::String build(int slot) const;

	/** Returns the highest filled slot number. */
	virtual uint32 getSlotMax() const;

	/** Returns the size of all existing slots + the index. */
	virtual int32 tallyUpFiles(uint32 slotSize, uint32 indexSize) const;

	/** Creates an index in buffer. */
	virtual void buildIndex(byte *buffer, SavePartInfo &info,
			SaveConverter *converter = 0, bool setLongest = false) const;

	virtual bool exists(int slot) const;
	virtual Common::InSaveFile *openRead(int slot) const;
	virtual Common::OutSaveFile *openWrite(int slot) const;

protected:
	Common::String _ext;
};

/** A static slot file ("foo.bar"). */
class SlotFileStatic : public SlotFile {
public:
	SlotFileStatic(GobEngine *vm, const Common::String &base, const Common::String &ext);
	~SlotFileStatic();

	int getSlot(int32 offset) const;
	int getSlotRemainder(int32 offset) const;

	/** Build the save file name. */
	Common::String build() const;

	virtual bool exists() const;
	virtual Common::InSaveFile *openRead() const;
	virtual Common::OutSaveFile *openWrite() const;

protected:
	Common::String _ext;
};

/** A handler for a specific save file. */
class SaveHandler {
public:
	SaveHandler(GobEngine *vm);
	virtual ~SaveHandler();

	/** Returns the file's (virtual) size. */
	virtual int32 getSize() = 0;
	/** Loads (parts of) the file. */
	virtual bool load(int16 dataVar, int32 size, int32 offset) = 0;
	/** Saves (parts of) the file. */
	virtual bool save(int16 dataVar, int32 size, int32 offset) = 0;

	/** Deletes the file. */
	virtual bool deleteFile();

	static uint32 getVarSize(GobEngine *vm);

protected:
	GobEngine *_vm;
};

/** A handler for temporary sprites. */
class TempSpriteHandler : public SaveHandler {
public:
	TempSpriteHandler(GobEngine *vm);
	~TempSpriteHandler();

	int32 getSize();
	bool load(int16 dataVar, int32 size, int32 offset);
	bool save(int16 dataVar, int32 size, int32 offset);

	bool create(uint32 width, uint32 height, bool trueColor);
	bool createFromSprite(int16 dataVar, int32 size, int32 offset);

protected:
	SavePartSprite *_sprite;

	/** Determine whether it's a dummy sprite save/load. */
	static bool isDummy(int32 size);
	/** Determine whether using a sprite was requested. */
	static bool isSprite(int32 size);
	/** Determine which sprite is meant. */
	static int getIndex(int32 size);
	/** Determine whether the palette should be used too. */
	static bool usesPalette(int32 size);

	SurfacePtr createSprite(int16 dataVar, int32 size, int32 offset);
};

/** A handler for notes. */
class NotesHandler : public SaveHandler {
public:
	NotesHandler(uint32 notesSize, GobEngine *vm, const Common::String &target);
	~NotesHandler();

	int32 getSize();
	bool load(int16 dataVar, int32 size, int32 offset);
	bool save(int16 dataVar, int32 size, int32 offset);

private:
	class File : public SlotFileStatic {
	public:
		File(GobEngine *vm, const Common::String &base);
		~File();
	};

	uint32 _notesSize;
	File *_file;
	SavePartVars *_notes;
};

/** A handler that behaves like a file but keeps the contents in memory. */
class FakeFileHandler : public SaveHandler {
public:
	FakeFileHandler(GobEngine *vm);
	~FakeFileHandler();

	int32 getSize();
	bool load(int16 dataVar, int32 size, int32 offset);
	bool save(int16 dataVar, int32 size, int32 offset);

	bool deleteFile();

private:
	Common::Array<byte> _data;
};

} // End of namespace Gob

#endif // GOB_SAVE_SAVEHANDLER_H