Files
scummvm-cursorfix/engines/ultima/ultima4/map/tileanim.h
2026-02-02 04:50:13 +01:00

236 lines
6.1 KiB
C++

/* 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