aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/he/sprite_he.h
blob: bb7f9574c85487bf2d475dbb3cc38d8e4607bc08 (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
/* 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.
 *
 */

#if !defined(SCUMM_HE_SPRITE_HE_H) && defined(ENABLE_HE)
#define SCUMM_HE_SPRITE_HE_H

#include "common/serializer.h"

namespace Scumm {

enum SpriteFlags {
	kSFChanged           = 0x1,
	kSFNeedRedraw        = 0x2,
	kSFScaled            = 0x10,
	kSFRotated           = 0x20,
	kSFDoubleBuffered    = 0x1000,
	kSFYFlipped          = 0x2000,
	kSFXFlipped          = 0x4000,
	kSFActive            = 0x8000,
	kSFRemapPalette      = 0x80000,
	kSFAutoAnim          = 0x200000,
	kSFMarkDirty         = 0x400000,
	kSFBlitDirectly      = 0x2000000,
	kSFImageless         = 0x40000000
};

enum SpriteGroupFlags {
	kSGFClipBox     = (1 << 0)
};

struct SpriteInfo {
	int32 id;
	int32 zorder;
	int32 flags;
	int32 image;
	int32 imageState;
	int32 group;
	int32 palette;
	int32 priority;
	Common::Rect bbox;
	int32 dx;
	int32 dy;
	Common::Point pos;
	int32 tx;
	int32 ty;
	int32 userValue;
	int32 curImageState;
	int32 curImage;
	int32 imglistNum;
	int32 shadow;
	int32 imageStateCount;
	int32 angle;
	int32 scale;
	int32 animProgress;
	int32 curAngle;
	int32 curScale;
	int32 curImgFlags;
	int32 animIndex;
	int32 animSpeed;
	int32 sourceImage;
	int32 maskImage;
	int32 zbufferImage;
	int32 classFlags;
	int32 imgFlags;
	int32 conditionBits;

	void reset() {
		id = 0;
		zorder = 0;
		flags = 0;
		image = 0;
		imageState = 0;
		group = 0;
		palette = 0;
		priority = 0;
		bbox.top = bbox.left = bbox.bottom = bbox.right = 0;
		dx = 0;
		dy = 0;
		pos.x = pos.y = 0;
		tx = 0;
		ty = 0;
		userValue = 0;
		curImageState = 0;
		curImage = 0;
		imglistNum = 0;
		shadow = 0;
		imageStateCount = 0;
		angle = 0;
		scale = 0;
		animProgress = 0;
		curAngle = 0;
		curScale = 0;
		curImgFlags = 0;
		animIndex = 0;
		animSpeed = 0;
		sourceImage = 0;
		maskImage = 0;
		zbufferImage = 0;
		classFlags = 0;
		imgFlags = 0;
		conditionBits = 0;
	}
};

struct SpriteGroup {
	Common::Rect bbox;
	int32 priority;
	int32 flags;
	int32 tx;
	int32 ty;
	int32 image;
	int32 scaling;
	int32 scale_x_ratio_mul;
	int32 scale_x_ratio_div;
	int32 scale_y_ratio_mul;
	int32 scale_y_ratio_div;

	void reset() {
		bbox.top = bbox.left = bbox.bottom = bbox.right = 0;
		priority = 0;
		flags = 0;
		tx = 0;
		ty = 0;
		image = 0;
		scaling = 0;
		scale_x_ratio_mul = 0;
		scale_x_ratio_div = 0;
		scale_y_ratio_mul = 0;
		scale_y_ratio_div = 0;
	}
};

class ScummEngine_v90he;

class Sprite : public Common::Serializable {
public:
	Sprite(ScummEngine_v90he *vm);
	virtual ~Sprite();

	SpriteInfo *_spriteTable;
	SpriteGroup *_spriteGroups;
	SpriteInfo **_activeSpritesTable;

	int32 _numSpritesToProcess;
	int32 _varNumSpriteGroups;
	int32 _varNumSprites;
	int32 _varMaxSprites;

	void saveLoadWithSerializer(Common::Serializer &s);
	void resetBackground();
	void setRedrawFlags(bool checkZOrder);
	void sortActiveSprites();
	void processImages(bool arg);
	void updateImages();

	int findSpriteWithClassOf(int x, int y, int spriteGroupId, int d, int num, int *args);
	int getSpriteClass(int spriteId, int num, int *args);
	int getSpriteFlagDoubleBuffered(int spriteId);
	int getSpriteFlagYFlipped(int spriteId);
	int getSpriteFlagXFlipped(int spriteId);
	int getSpriteFlagActive(int spriteId);
	int getSpriteFlagRemapPalette(int spriteId);
	int getSpriteFlagAutoAnim(int spriteId);
	int getSpriteFlagUpdateType(int spriteId);
	int getSpriteFlagEraseType(int spriteId);
	int getSpriteImage(int spriteId);
	int getSpriteImageState(int spriteId);
	int getSpriteGroup(int spriteId);
	int getSpritePalette(int spriteId);
	int getSpritePriority(int spriteId);
	int getSpriteDisplayX(int spriteId);
	int getSpriteDisplayY(int spriteId);
	int getSpriteUserValue(int spriteId);
	int getSpriteShadow(int spriteId);
	int getSpriteImageStateCount(int spriteId);
	int getSpriteScale(int spriteId);
	int getSpriteAnimSpeed(int spriteId);
	int getSpriteSourceImage(int spriteId);
	int getSpriteMaskImage(int spriteId);
	int getSpriteGeneralProperty(int spriteId, int type);
	void getSpriteBounds(int spriteId, bool checkGroup, Common::Rect &bound);
	void getSpriteImageDim(int spriteId, int32 &w, int32 &h);
	void getSpritePosition(int spriteId, int32 &tx, int32 &ty);
	void getSpriteDist(int spriteId, int32 &dx, int32 &dy);

	int getGroupPriority(int spriteGroupId);
	int getGroupDstResNum(int spriteGroupId);
	int getGroupXMul(int spriteGroupId);
	int getGroupXDiv(int spriteGroupId);
	int getGroupYMul(int spriteGroupId);
	int getGroupYDiv(int spriteGroupId);
	void getGroupPosition(int spriteGroupId, int32 &tx, int32 &ty);

	void setSpritePalette(int spriteId, int value);
	void setSpriteSourceImage(int spriteId, int value);
	void setSpriteMaskImage(int spriteId, int value);
	void resetSprite(int spriteId);
	void setSpriteImageState(int spriteId, int value);
	void setSpritePosition(int spriteId, int value1, int value2);
	void setSpriteGroup(int spriteId, int value);
	void setSpriteDist(int spriteId, int value1, int value2);
	void setSpriteShadow(int spriteId, int value);
	void setSpriteUserValue(int spriteId, int value1, int value2);
	void setSpritePriority(int spriteId, int value);
	void moveSprite(int spriteId, int value1, int value2);
	void setSpriteScale(int spriteId, int value);
	void setSpriteAngle(int spriteId, int value);
	void setSpriteFlagDoubleBuffered(int spriteId, int value);
	void setSpriteFlagYFlipped(int spriteId, int value);
	void setSpriteFlagXFlipped(int spriteId, int value);
	void setSpriteFlagActive(int spriteId, int value);
	void setSpriteFlagRemapPalette(int spriteId, int value);
	void setSpriteFlagAutoAnim(int spriteId, int value);
	void setSpriteFlagUpdateType(int spriteId, int value);
	void setSpriteFlagEraseType(int spriteId, int value);
	void setSpriteAnimSpeed(int spriteId, int value);
	void setSpriteSetClass(int spriteId, int classId, int toggle);
	void setSpriteResetClass(int spriteId);
	void setSpriteZBuffer(int spriteId, int value);
	void setSpriteGeneralProperty(int spriteId, int type, int value);

	void moveGroupMembers(int spriteGroupId, int value1, int value2);
	void redrawSpriteGroup(int spriteGroupId);
	void setGroupMembersPriority(int spriteGroupId, int value);
	void setGroupMembersGroup(int spriteGroupId, int value);
	void setGroupMembersUpdateType(int spriteGroupId, int value);
	void setGroupMembersResetSprite(int spriteGroupId);
	void setGroupMembersAnimationSpeed(int spriteGroupId, int value);
	void setGroupMembersAutoAnimFlag(int spriteGroupId, int value);
	void setGroupMembersShadow(int spriteGroupId, int value);

	void moveGroup(int spriteGroupId, int value1, int value2);
	void setGroupBounds(int spriteGroupId, int x1, int y1, int x2, int y2);
	void setGroupPriority(int spriteGroupId, int value);
	void setGroupPosition(int spriteGroupId, int value1, int value2);
	void setGroupImage(int spriteGroupId, int value);
	void setGroupScaling(int spriteGroupId);
	void setGroupXMul(int spriteGroupId, int value);
	void setGroupXDiv(int spriteGroupId, int value);
	void setGroupYMul(int spriteGroupId, int value);
	void setGroupYDiv(int spriteGroupId, int value);
	void resetGroupBounds(int spriteGroupId);

	void allocTables(int numSprites, int numGroups, int numMaxSprites);
	void resetGroup(int spriteGroupId);
	void resetTables(bool refreshScreen);
	void setSpriteImage(int spriteId, int imageNum);
private:
	ScummEngine_v90he *_vm;
};

} // End of namespace Scumm

#endif