aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/structs.h
blob: cc300e893162f6306224f14dd221f6c5caa485f2 (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
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
/* 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 DreamWeb {

struct GraphicsFile;
struct SetObject;

struct Sprite {
	bool _mainManCallback;
	const GraphicsFile *_frameData;
	uint8  x;
	uint8  y;
	uint8  frameNumber;
	uint8  delay;
	uint8  animFrame; // index into SetObject::frames
	SetObject *_objData;
	uint8  speed;
	uint8  priority;
	uint8  walkFrame;
	uint8  type;
	uint8  hidden;
};

struct RectWithCallback {
	uint16 _xMin, _xMax;
	uint16 _yMin, _yMax;
	void (DreamWebEngine::*_callback)();

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



#include "common/pack-start.h"	// START STRUCT PACKING

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 objId[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;
} PACKED_STRUCT;

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 objId[4];
} PACKED_STRUCT;

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

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

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

#include "common/pack-end.h"	// END STRUCT PACKING



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



#include "common/pack-start.h"	// START STRUCT PACKING

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

extern const Room g_roomData[];

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

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

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

struct PathSegment {
	uint8 b0;
	uint8 b1;
} PACKED_STRUCT;

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

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

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

#include "common/pack-end.h"	// END STRUCT PACKING



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



#include "common/pack-start.h"	// START STRUCT PACKING

struct BackdropMapFlag {
	uint8 _flag;
	uint8 _flagEx;
} PACKED_STRUCT;

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

#include "common/pack-end.h"	// END STRUCT PACKING





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), _frames(0) { }

	Frame *_frames;
	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[] _frames;
		_frames = 0;
		delete[] _data;
		_data = 0;
	}
};

struct GameVars {
	uint8 _startVars;
	uint8 _progressPoints;
	uint8 _watchOn;
	uint8 _shadesOn;
	uint8 _secondCount;
	uint8 _minuteCount;
	uint8 _hourCount;
	uint8 _zoomOn;
	uint8 _location;
	uint8 _exPos;
	uint16 _exFramePos;
	uint16 _exTextPos;
	uint16 _card1Money;
	uint16 _listPos;
	uint8 _ryanPage;
	uint16 _watchingTime;
	uint16 _reelToWatch; // reel plays from here in mode 0
	uint16 _endWatchReel; // and stops here. Mode set to 1
	uint8 _speedCount;
	uint8 _watchSpeed;
	uint16 _reelToHold; // if mode is 1 hold on this reel
	uint16 _endOfHoldReel; // if mode is 2 then play to endOfHoldReel and reset mode to -1
	uint8 _watchMode;
	uint8 _destAfterHold; // set walking destination
	uint8 _newsItem;
	uint8 _liftFlag;
	uint8 _liftPath;
	uint8 _lockStatus;
	uint8 _doorPath;
	uint8 _countToOpen;
	uint8 _countToClose;
	uint8 _rockstarDead;
	uint8 _generalDead;
	uint8 _sartainDead;
	uint8 _aideDead;
	uint8 _beenMugged;
	uint8 _gunPassFlag;
	uint8 _canMoveAltar;
	uint8 _talkedToAttendant;
	uint8 _talkedToSparky;
	uint8 _talkedToBoss;
	uint8 _talkedToRecep;
	uint8 _cardPassFlag;
	uint8 _madmanFlag;
	uint8 _keeperFlag;
	uint8 _lastTrigger;
	uint8 _manDead;
	uint8 _seed1;
	uint8 _seed2;
	uint8 _seed3;
	uint8 _needToTravel;
	uint8 _throughDoor;
	uint8 _newObs;
	uint8 _ryanOn;
	uint8 _combatCount;
	uint8 _lastWeapon;
	uint8 _dreamNumber;
	uint8 _roomAfterDream;
	uint8 _shakeCounter;
};

struct TimedTemp {
	TimedTemp() : _timeCount(0), _string(0) { }

	uint8 _x;
	uint8 _y;

	uint16 _timeCount;
	uint16 _countToTimed;

	const char *_string;
};

} // End of namespace DreamWeb

#endif