aboutsummaryrefslogtreecommitdiff
path: root/engines/access/files.h
blob: d081934e91cd894c371943583dee1018a9befb98 (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
/* 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 ACCESS_FILES_H
#define ACCESS_FILES_H

#include "common/scummsys.h"
#include "common/array.h"
#include "common/file.h"
#include "graphics/surface.h"
#include "access/decompress.h"

namespace Access {

class AccessEngine;

struct FileIdent {
	int _fileNum;
	int _subfile;

	FileIdent();
	FileIdent(int fileNum, int subfile) { _fileNum = fileNum; _subfile = subfile; }

	void load(Common::SeekableReadStream &s);
};

struct CellIdent : FileIdent {
	byte _cell;

	CellIdent();
	CellIdent(int cell, int fileNum, int subfile);
};

class FileManager;

class Resource {
	friend class FileManager;
private:
	Common::File _file;
	byte *_data;
public:
	Common::SeekableReadStream *_stream;
	int _size;

	Resource();
	Resource(byte *data, int size);
	~Resource();
	byte *data();
};

class FileManager {
private:
	AccessEngine *_vm;

	void openFile(Resource *res, const Common::String &filename);

	/**
	 * Handles setting up the resource with a stream for the located resource
	 */
	void handleFile(Resource *res);
	
	/**
	 * Handles loading a screen surface and palette with decoded resource
	 */
	void handleScreen(Graphics::Surface *dest, Resource *res);

	/**
	* Open up a sub-file container file
	*/
	void setAppended(Resource *file, int fileNum);

	/**
	* Open up a sub-file resource within an alrady opened container file.
	*/
	void gotoAppended(Resource *file, int subfile);
public:
	int _fileNumber;
	Common::Array<uint32> _fileIndex;
	bool _setPaletteFlag;
public:
	FileManager(AccessEngine *vm);
	~FileManager();

	/**
	 * Check the existence of a given file
	 */
	bool existFile(const Common::String &filename);

	/**
	 * Load a given subfile from a container file
	 */
	Resource *loadFile(int fileNum, int subfile);

	/**
	 * Loads a resource specified by a file identifier
	 */
	Resource *loadFile(const FileIdent &fileIdent);

	/**
	 * Load a given file by name
	 */
	Resource *loadFile(const Common::String &filename);

	/**
	 * Load a given scren from a container file
	 */
	void loadScreen(int fileNum, int subfile);

	/**
	* Load a given screen by name
	*/
	void loadScreen(const Common::String &filename);

	/**
	 * Load a screen resource onto a designated surface
	 */
	void loadScreen(Graphics::Surface *dest, int fileNum, int subfile);
};

} // End of namespace Access

#endif /* ACCESS_FILES_H */