/** 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 m_vGroupedAnims; std::vector m_vFrames; std::vector m_vElements; std::vector 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); };