aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/view.h
blob: 88094d683339b928792449a541356f23d0a9f323 (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
/* 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 AGI_VIEW_H
#define AGI_VIEW_H

namespace Agi {

struct AgiViewCel {
	uint8 height;
	uint8 width;
	uint8 clearKey;
	bool  mirrored;
	byte *rawBitmap;
};

struct AgiViewLoop {
	int16 celCount;
	AgiViewCel *cel;
};

/**
 * AGI view resource structure.
 */
struct AgiView {
	byte  headerStepSize;
	byte  headerCycleTime;
	byte *description;
	int16 loopCount;
	AgiViewLoop *loop;

	void reset() {
		headerStepSize = 0;
		headerCycleTime = 0;
		description = nullptr;
		loopCount = 0;
		loop = nullptr;
	}

	AgiView() { reset(); }
};

enum MotionType {
	kMotionNormal = 0,
	kMotionWander = 1,
	kMotionFollowEgo = 2,
	kMotionMoveObj = 3,
	kMotionEgo = 4 // used by us for mouse movement only?
};

enum CycleType {
	kCycleNormal = 0,
	kCycleEndOfLoop = 1,
	kCycleRevLoop = 2,
	kCycleReverse = 3
};

enum ViewFlags {
	fDrawn          = (1 << 0),     // 0x0001
	fIgnoreBlocks   = (1 << 1),     // 0x0002
	fFixedPriority  = (1 << 2),     // 0x0004
	fIgnoreHorizon  = (1 << 3),     // 0x0008
	fUpdate         = (1 << 4),     // 0x0010
	fCycling        = (1 << 5),     // 0x0020
	fAnimated       = (1 << 6),     // 0x0040
	fMotion         = (1 << 7),     // 0x0080
	fOnWater        = (1 << 8),     // 0x0100
	fIgnoreObjects  = (1 << 9),     // 0x0200
	fUpdatePos      = (1 << 10),    // 0x0400
	fOnLand         = (1 << 11),    // 0x0800
	fDontupdate     = (1 << 12),    // 0x1000
	fFixLoop        = (1 << 13),    // 0x2000
	fDidntMove      = (1 << 14),    // 0x4000
	fAdjEgoXY       = (1 << 15)     // 0x8000
};

/**
 * AGI screen object table entry
 */
struct ScreenObjEntry {
	int16 objectNr; // 0-255 -> regular screenObjTable, -1 -> addToPic-view
	uint8 stepTime;
	uint8 stepTimeCount;
	int16 xPos;
	int16 yPos;
	uint8 currentViewNr;
	bool viewReplaced;
	struct AgiView *viewResource;
	uint8 currentLoopNr;
	uint8 loopCount;
	struct AgiViewLoop *loopData;
	uint8 currentCelNr;
	uint8 celCount;
	struct AgiViewCel *celData;
	//int16 xPos2;
	//int16 yPos2;
	int16 xSize;
	int16 ySize;

	int16 xPos_prev;
	int16 yPos_prev;
	int16 xSize_prev;
	int16 ySize_prev;

	uint8 stepSize;
	uint8 cycleTime;
	uint8 cycleTimeCount;
	uint8 direction;
	MotionType motionType;
	CycleType cycle;
	uint8 priority;
	uint16 flags;
	// kMotionMoveObj
	int16 move_x;
	int16 move_y;
	uint8 move_stepSize;
	uint8 move_flag;
	// kMotionFollowEgo
	uint8 follow_stepSize;
	uint8 follow_flag;
	uint8 follow_count;
	// kMotionWander
	uint8 wander_count;
	// end of motion related variables
	uint8 loop_flag;

	void reset() { memset(this, 0, sizeof(ScreenObjEntry)); }
	ScreenObjEntry() { reset(); }
}; // struct vt_entry

} // End of namespace Agi

#endif /* AGI_VIEW_H */