/** Data of an animation group. */
class AnimGroupData
{
public:
AnimGroupData();
AnimGroupData(const AnimGroupData &ag);
AnimGroupData &operator=(const AnimGroupData &ag);
int m_iTileSize; ///< Size of a tile for this animation group.
int m_iAnimLength; ///< Number of frames in an animation of this group.
std::string m_sName; ///< Name of the animation group.
int m_aFirstFrames[4]; ///< Index into AnimationStorage::m_vFrames of the first frame, else \c -1.
};
/** Data of a frame in an animation. */
class FrameData
{
public:
FrameData();
FrameData(const FrameData &fd);
FrameData &operator=(const FrameData &fd);
int m_iSound; ///< If non-zero, sound to play.
int m_iNumberElements; ///< Number of sprite elements in the frame.
int m_iFirstElement; ///< Index of the first sprite element in AnimationStorage::m_vElements.
};
/** Flags of a sprite element. */
enum ElementFlags
{
ELM_FLIP_VERT = 0x1, ///< Flip sprite vertically.
ELM_FLIP_HOR = 0x2, ///< Flip sprite horizontally.
ELM_ALPHA_50 = 0x4, ///< Apply alpha 50%.
ELM_ALPHA_75 = 0x8, ///< Apply alpha 75%.
};
/** Data of a sprite element in a frame. */
class ElementData
{
public:
ElementData();
ElementData(const ElementData &ed);
ElementData &operator=(const ElementData &ed);
int m_iSprite;
int m_iXoffset;
int m_iYoffset;
int m_iLayerClass; ///< Class of the display condition.
int m_iLayerId; ///< Value of the display condition.
int m_iFlags; ///< Flags, @see ElementFlags for the fields.
};
/** Data of a sprite, used in an element. */
class SpriteData
{
public:
SpriteData();
SpriteData(const SpriteData &sd);
SpriteData &operator=(const SpriteData &sd);
int m_iWidth;
int m_iHeight;
int m_iDataLength; ///< Number of bytes in AnimationStorage::m_pSpriteData for this sprite.
int m_iDataOffset; ///< Offset of the first byte in AnimationStorage::m_pSpriteData.
};
class AnimationStorage
{
public:
AnimationStorage();
bool LoadFile(Input &oInput);
std::vector<AnimGroupData> m_vGroupedAnims;
std::vector<FrameData> m_vFrames;
std::vector<ElementData> m_vElements;
std::vector<SpriteData> m_vSprites;
unsigned char *m_pSpriteData;
size_t m_iSpriteDataSize;
private:
bool LoadAnimGroup(AnimGroupData &oAnimGrp, int iFramesUsed, Input &oInput);
bool LoadFrame(FrameData &oFrame, int &iElementsUsed, int iSpritesUsed, Input &oInput);
bool LoadSprite(SpriteData &oSprite, int &iSpriteDataUsed, oInput &oInput);
};