File: tileanim.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (235 lines) | stat: -rw-r--r-- 6,230 bytes parent folder | download | duplicates (3)
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
/* 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 3 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, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef ULTIMA4_MAP_TILEANIM_H
#define ULTIMA4_MAP_TILEANIM_H

#include "ultima/ultima4/map/direction.h"

namespace Ultima {
namespace Ultima4 {

class ConfigElement;
class Image;
class Tile;
struct RGBA;

/**
 * The interface for tile animation transformations.
 */
class TileAnimTransform {
public:
	static TileAnimTransform *create(const ConfigElement &config);

	/**
	 * Loads a color from a config element
	 */
	static RGBA *loadColorFromConf(const ConfigElement &conf);

	virtual void draw(Image *dest, Tile *tile, MapTile &mapTile) = 0;
	virtual ~TileAnimTransform() {}
	virtual bool drawsTile() const = 0;

	// Properties
	int _random;
};

/**
 * A tile animation transformation that turns a piece of the tile
 * upside down.  Used for animating the flags on building and ships.
 */
class TileAnimInvertTransform : public TileAnimTransform {
public:
	TileAnimInvertTransform(int xp, int yp, int width, int height);
	void draw(Image *dest, Tile *tile, MapTile &mapTile) override;
	bool drawsTile() const override;

private:
	int x, y, w, h;
};

/**
 * A tile animation transformation that changes a single pixels to a
 * random color selected from a list.  Used for animating the
 * campfire in EGA mode.
 */
class TileAnimPixelTransform : public TileAnimTransform {
public:
	TileAnimPixelTransform(int xp, int yp);
	void draw(Image *dest, Tile *tile, MapTile &mapTile) override;
	bool drawsTile() const override;

	int x, y;
	Std::vector<RGBA *> _colors;
};

/**
 * A tile animation transformation that scrolls the tile's contents
 * vertically within the tile's boundaries.
 */
class TileAnimScrollTransform : public TileAnimTransform {
public:
	TileAnimScrollTransform(int increment);
	void draw(Image *dest, Tile *tile, MapTile &mapTile) override;
	bool drawsTile() const override;
private:
	int _increment, _current, _lastOffset;
};

/**
 * A tile animation transformation that advances the tile's frame
 * by 1.
 */
class TileAnimFrameTransform : public TileAnimTransform {
public:
	TileAnimFrameTransform() : _currentFrame(0) {
	}
	void draw(Image *dest, Tile *tile, MapTile &mapTile) override;

	/**
	 * Advance the frame by one and draw it!
	 */
	bool drawsTile() const override;
protected:
	int _currentFrame;
};

/**
 * A tile animation transformation that changes pixels with colors
 * that fall in a given range to another color.  Used to animate
 * the campfire in VGA mode.
 */
class TileAnimPixelColorTransform : public TileAnimTransform {
public:
	TileAnimPixelColorTransform(int xp, int yp, int width, int height);
	~TileAnimPixelColorTransform() override;

	void draw(Image *dest, Tile *tile, MapTile &mapTile) override;
	bool drawsTile() const override;

	int x, y, w, h;
	RGBA *_start, *_end;
};

/**
 * A context in which to perform the animation
 */
class TileAnimContext {
public:
	typedef Std::vector<TileAnimTransform *> TileAnimTransformList;
	typedef enum {
		FRAME,
		DIR
	} Type;

	/**
	 * Creates a new animation context which controls if animation transforms are performed or not
	 */
	static TileAnimContext *create(const ConfigElement &config);

	/**
	 * Adds a tile transform to the context
	 */
	void add(TileAnimTransform *);
	virtual bool isInContext(Tile *t, MapTile &mapTile, Direction d) = 0;
	TileAnimTransformList &getTransforms() {
		return _animTransforms;   /**< Returns a list of transformations under the context. */
	}
	virtual ~TileAnimContext() {}
private:

	TileAnimTransformList _animTransforms;
};

/**
 * An animation context which changes the animation based on the tile's current frame
 */
class TileAnimFrameContext : public TileAnimContext {
public:
	/**
	 * A context which depends on the tile's current frame for animation
	 */
	TileAnimFrameContext(int frame);
	bool isInContext(Tile *t, MapTile &mapTile, Direction d) override;

private:
	int _frame;
};

/**
 * An animation context which changes the animation based on the player's current facing direction
 */
class TileAnimPlayerDirContext : public TileAnimContext {
public:
	/**
	 * An animation context which changes the animation based on the player's current facing direction
	 */
	TileAnimPlayerDirContext(Direction dir);
	bool isInContext(Tile *t, MapTile &mapTile, Direction d) override;

private:
	Direction _dir;
};

/**
 * Instructions for animating a tile.  Each tile animation is made up
 * of a list of transformations which are applied to the tile after it
 * is drawn.
 */
class TileAnim {
public:
	TileAnim(const ConfigElement &conf);
	~TileAnim();

	Common::String _name;
	Std::vector<TileAnimTransform *> _transforms;
	Std::vector<TileAnimContext *> _contexts;

	/* returns the frame to set the mapTile to (only relevant if persistent) */
	void draw(Image *dest, Tile *tile, MapTile &mapTile, Direction dir);

	int _random;   /* true if the tile animation occurs randomely */
};

/**
 * A set of tile animations.  Tile animations are associated with a
 * specific image set which shares the same name.
 */
class TileAnimSet {
	typedef Common::HashMap<Common::String, TileAnim *> TileAnimMap;

public:
	TileAnimSet(const ConfigElement &conf);
	~TileAnimSet();

	/**
	 * Returns the tile animation with the given name from the current set
	 */
	TileAnim *getByName(const Common::String &name);

	Common::String _name;
	TileAnimMap _tileAnims;
};

} // End of namespace Ultima4
} // End of namespace Ultima

#endif