aboutsummaryrefslogtreecommitdiff
path: root/queen/resource.h
blob: 1e9744446378ad1135242310cc97f292966ab2bd (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
/* ScummVM - Scumm Interpreter
 * Copyright (C) 2003-2004 The ScummVM project
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $Header$
 *
 */

#ifndef QUEENRESOURCE_H
#define QUEENRESOURCE_H

#include "common/file.h"
#include "common/util.h"
#include "queen/defs.h"

namespace Queen {

enum Version {
	VER_ENG_FLOPPY   = 0,
	VER_ENG_TALKIE   = 1,
	VER_FRE_FLOPPY   = 2,
	VER_FRE_TALKIE   = 3,
	VER_GER_FLOPPY   = 4,
	VER_GER_TALKIE   = 5,
	VER_ITA_FLOPPY   = 6,
	VER_ITA_TALKIE   = 7,
	// VER_SPA_FLOPPY
	VER_SPA_TALKIE   = 8,
	// VER_HEB_FLOPPY
	// VER_HEB_TALKIE
	VER_DEMO_PCGAMES = 9,
	VER_DEMO         = 10,
	VER_INTERVIEW    = 11,

	VER_COUNT        = 12
};

struct ResourceEntry {
	char filename[13];
	uint8 bundle;
	uint32 offset;
	uint32 size;
};

struct GameVersion {
	char versionString[6];
	uint32 tableOffset;
	uint32 dataFileSize;
};

class LineReader {

public:
	LineReader(char *buffer, uint32 bufsize);
	~LineReader();
	char *nextLine();

private:
	char *_buffer;
	uint32 _bufSize;
	int _current;
};

class Resource {

public:
	Resource(const Common::String &datafilePath);
	~Resource(void);

	uint8 *loadFile(const char *filename, uint32 skipBytes = 0, byte *dstBuf = NULL);
	uint8 *loadFileMalloc(const char *filename, uint32 skipBytes = 0, byte *dstBuf = NULL);
	bool fileExists(const char *filename) const { return resourceEntry(filename) != NULL; }
	uint32 fileSize(const char *filename) const { return resourceEntry(filename)->size; }

	File *giveCompressedSound(const char *filename);

	bool isDemo() const { return !strcmp(_versionString, "PE100"); }
	bool isInterview() const { return !strcmp(_versionString, "PEint"); }
	bool isFloppy() const { return _versionString[0] == 'P'; }
	uint8 compression() const { return _compression; }
	const char *JASVersion() const { return _versionString; }
	Language getLanguage() const;

	enum {
		JAS_VERSION_OFFSET_DEMO = 0x119A8,
		JAS_VERSION_OFFSET_INTV = 0xCF8,
		JAS_VERSION_OFFSET	    = 0x12484
	};

protected:
	File *_resourceFile;
	uint8 _compression;
	const Common::String _datafilePath;
	char _versionString[6];
	const char *_savePath;
	uint32 _resourceEntries;
	ResourceEntry *_resourceTable;

	bool findNormalVersion();
	bool findCompressedVersion();
	void checkJASVersion();
	int32 resourceIndex(const char *filename) const;
	ResourceEntry *resourceEntry(const char *filename) const;
	bool readTableFile(const GameVersion *gameVersion);
	void readTableCompResource();
	void readTableEntries(File *file);
	const GameVersion *detectGameVersion(uint32 size) const;

	static const char *_tableFilename;
	static const GameVersion _gameVersions[];
	static ResourceEntry _resourceTablePEM10[];
};

} // End of namespace Queen

#endif