Initial commit
This commit is contained in:
235
engines/ultima/ultima4/map/tileanim.h
Normal file
235
engines/ultima/ultima4/map/tileanim.h
Normal file
@@ -0,0 +1,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
|
||||
Reference in New Issue
Block a user