aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/structs.h
blob: db1e51fafcbc4918a131c716a0a7fef845d185f8 (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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
/* 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 DREAMWEB_STRUCTS_H
#define DREAMWEB_STRUCTS_H

#include "common/endian.h"
#include "common/rect.h"

namespace DreamGen {

struct GraphicsFile;
struct SetObject;

struct Sprite {
	uint16 _updateCallback;
	uint16 w2;
	uint16 w4;
	const GraphicsFile *_frameData;
	uint16 w8;
	uint8  x;
	uint8  y;
	uint16 w12;
	uint8  b14;
	uint8  frameNumber;
	uint8  b16;
	uint8  b17;
	uint8  delay;
	uint8  animFrame; // index into SetObject::frames
	SetObject *_objData;
	uint8  speed;
	uint8  priority;
	uint16 w24;
	uint16 w26;
	uint8  b28;
	uint8  walkFrame;
	uint8  type;
	uint8  hidden;
};

class DreamGenContext;

template <class T = DreamGenContext>
struct RectWithCallback {
	uint16 _xMin, _xMax;
	uint16 _yMin, _yMax;
	void (T::*_callback)();

	bool contains(uint16 x, uint16 y) const {
		return (x >= _xMin) && (x < _xMax) && (y >= _yMin) && (y < _yMax);
	}
};

struct SetObject {
	uint8 b0;
	uint8 b1;
	uint8 b2;
	uint8 slotSize;
	uint8 slotCount;
	uint8 priority;
	uint8 b6;
	uint8 delay;
	uint8 type;
	uint8 b9;
	uint8 b10;
	uint8 b11;
	uint8 name[4];
	uint8 b16;
	uint8 index;
	uint8 frames[13]; // Table mapping animFrame to sprite frame number
	                  // NB: Don't know the size yet
	uint8 b31;
	uint8 b32;
	uint8 b33;
	uint8 b34;
	uint8 b35;
	uint8 b36;
	uint8 b37;
	uint8 b38;
	uint8 b39;
	uint8 b40;
	uint8 b41;
	uint8 b42;
	uint8 b43;
	uint8 b44;
	uint8 b45;
	uint8 b46;
	uint8 b47;
	uint8 b48;
	uint8 b49;
	uint8 b50;
	uint8 b51;
	uint8 b52;
	uint8 b53;
	uint8 b54;
	uint8 b55;
	uint8 b56;
	uint8 b57;
	uint8 mapad[5];
	uint8 b63;
};

struct DynObject {
	uint8 currentLocation;
	uint8 index;
	uint8 mapad[5];
	uint8 slotSize;		// the size of an object's slots
	uint8 slotCount;	// the number of slots of an object
	uint8 objectSize;	// the size of an object
	uint8 turnedOn;
	uint8 initialLocation;
	uint8 id[4];
};

struct ObjPos {
	uint8 xMin;
	uint8 yMin;
	uint8 xMax;
	uint8 yMax;
	uint8 index;
	bool contains(uint8 x, uint8 y) const {
		return (x >= xMin) && (x < xMax) && (y >= yMin) && (y < yMax);
	}
};

struct Frame {
	uint8  width;
	uint8  height;
	uint16 _ptr;
	uint16 ptr() const { return READ_LE_UINT16(&_ptr); }
	void setPtr(uint16 v) { WRITE_LE_UINT16(&_ptr, v); }
	uint8  x;
	uint8  y;
};

struct Reel {
	uint8 frame_lo;
	uint8 frame_hi;
	uint16 frame() const { return READ_LE_UINT16(&frame_lo); }
	void setFrame(uint16 v) { WRITE_LE_UINT16(&frame_lo, v); }
	uint8 x;
	uint8 y;
	uint8 b4;
};

struct ReelRoutine {
	uint8 reallocation;
	uint8 mapX;
	uint8 mapY;
	uint16 _reelPointer;
	uint16 reelPointer() const { return _reelPointer; }
	void setReelPointer(uint16 v) { _reelPointer = v; }
	void incReelPointer() { _reelPointer++; }
	uint8 period;
	uint8 counter;
	uint8 b7;
};

struct People {
	uint16 _reelPointer;
	ReelRoutine *_routinePointer;
	uint8 b4;

};

struct Room {
	char  name[13];
	uint8 roomsSample;
	uint8 b14;
	uint8 mapX;
	uint8 mapY;
	uint8 b17;
	uint8 b18;
	uint8 b19;
	uint8 liftFlag;
	uint8 b21;
	uint8 facing;
	uint8 countToOpen;
	uint8 liftPath;
	uint8 doorPath;
	uint8 b26;
	uint8 b27;
	uint8 b28;
	uint8 b29;
	uint8 b30;
	uint8 realLocation;
};
extern const Room g_roomData[];

struct Rain {
	uint8 x;
	uint8 y;
	uint8 size;
	uint16 w3;
	uint8 b5;
};

struct Change {
	uint8 index;
	uint8 location;
	uint8 value;
	uint8 type;
};

struct PathNode {
	uint8 x;
	uint8 y;
	uint8 x1;
	uint8 y1;
	uint8 x2;
	uint8 y2;
	uint8 on;
	uint8 dir;
};

struct PathSegment {
	uint8 b0;
	uint8 b1;
};

struct RoomPaths {
	PathNode    nodes[12];
	PathSegment segments[24];
};

struct FileHeader {
	char _desc[50];
	uint16 _len[20];
	uint8 _padding[6];

	uint16 len(unsigned int i) const {
		assert(i < 20);
		return READ_LE_UINT16(&_len[i]);
	}
	void setLen(unsigned int i, uint16 length) {
		assert(i < 20);
		WRITE_LE_UINT16(&_len[i], length);
	}
};

struct Atmosphere {
	uint8 _location;
	uint8 _mapX;
	uint8 _mapY;
	uint8 _sound;
	uint8 _repeat;
};

enum ObjectTypes {
	kSetObjectType1 = 1,
	kFreeObjectType = 2,
	kSetObjectType3 = 3,
	kExObjectType = 4
};

struct ObjectRef {
	uint8 _index;
	uint8 _type; // enum ObjectTypes

	bool operator==(const ObjectRef &r) const {
		return _index == r._index && _type == r._type;
	}
	bool operator!=(const ObjectRef &r) const {
		return _index != r._index || _type != r._type;
	}
};

struct BackdropMapFlag {
	uint8 _flag;
	uint8 _flagEx;
};

struct MapFlag {
	uint8 _flag;
	uint8 _flagEx;
	uint8 _type;
};

struct TextFile {
	TextFile(unsigned int size = 66) : _size(size), _text(0) { _offsetsLE = new uint16[_size]; }

	~TextFile() {
		delete[] _offsetsLE;
		_offsetsLE = 0;
		_size = 0;
		clear();
	}

	uint16 *_offsetsLE;
	unsigned int _size;
	char *_text;

	const char *getString(unsigned int i) const {
		assert(i < _size);
		return _text + getOffset(i);
	}
	void setOffset(unsigned int i, uint16 offset) {
		WRITE_LE_UINT16(&_offsetsLE[i], offset);
	}
	uint16 getOffset(unsigned int i) const {
		return READ_LE_UINT16(&_offsetsLE[i]);
	}
	void clear() {
		delete[] _text;
		_text = 0;
	}
};

struct GraphicsFile {
	GraphicsFile() : _data(0) { }

	Frame _frames[347];
	uint8 *_data;

	const uint8 *getFrameData(unsigned int i) const {
		// There is 2080 bytes of Frame data, but that is between 346 and 347
		// frames
		assert(i < 346);
		return _data + _frames[i].ptr();
	}
	void clear() {
		delete[] _data;
		_data = 0;
	}
};


} // End of namespace DreamWeb

#endif