aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/save/savehandler.h
blob: 723215cf084c24c071ee0dac300b5b5cb7bfdd62 (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
/* 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.
 *
 * $URL$
 * $Id$
 *
 */

#ifndef GOB_SAVE_SAVEHANDLER_H
#define GOB_SAVE_SAVEHANDLER_H

#include "common/savefile.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) 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;

	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);

	/** Create a fitting sprite. */
	bool createSprite(int16 dataVar, int32 size,
			int32 offset, SurfacePtr *sprite = 0);

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);
};

/** 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;
};

} // End of namespace Gob

#endif // GOB_SAVE_SAVEHANDLER_H