--- /dev/null
+#include "Sprite.h"\r
+\r
+\r
+Sprite::Sprite()\r
+: mWidth(0)\r
+, mHeight(0)\r
+, mNumFrames(0)\r
+, mTraits(0)\r
+, mCurrentAnim(0)\r
+, mCurrentFrame(0)\r
+, mCurrentTime(0)\r
+, mID(-1)\r
+, mSpritePtr(0)\r
+, mAnimPtr(0)\r
+, mInterface((ScriptInterface*)0)\r
+{\r
+}\r
+\r
+Sprite::Sprite(char const * const sprite, char const * const animation, VectorT<S8> position, bool hflip, bool vflip, bool invert, bool trans)\r
+: mWidth(sprite[0])\r
+, mHeight(sprite[1])\r
+, mNumFrames(sprite[2])\r
+, mTraits(0)\r
+, mCurrentAnim(0)\r
+, mCurrentFrame(0)\r
+, mCurrentTime(0)\r
+, mID(-1)\r
+, mPosition(position)\r
+, mSpritePtr(sprite + SPITE_HEADER_SIZE)\r
+, mAnimPtr(animation)\r
+, mInterface((ScriptInterface*)0)\r
+{\r
+ //ensures that the value is either 0 or 1 (U8 bool)\r
+ hflip = !!hflip;\r
+ vflip = !!vflip;\r
+ invert = !!invert;\r
+ trans = !!trans;\r
+\r
+ //set the traits for this sprite, they are only meaningful at render time\r
+ mTraits = (hflip*(1<<eTrait_HFlip)) | (vflip*(1<<eTrait_VFlip)) | (invert*(1<<eTrait_Invert)) | (trans*(1<<eTrait_Transparent));\r
+}\r
+\r
+void Sprite::update()\r
+{\r
+ //go to the next frame\r
+ if((mCurrentTime--) == 0)\r
+ {\r
+ setNextAnimFrame();\r
+ }\r
+}\r
+\r
+char const * const Sprite::getCurrentFramePtr() const\r
+{\r
+ //return a pointer to the current frame\r
+ U16 offset = mCurrentFrame * (mWidth * mHeight)/8;\r
+ return &(mSpritePtr[offset]);\r
+}\r
+\r
+U16 Sprite::getSptiteByteCount() const\r
+{\r
+ //return the number of bytes in a frame\r
+ return mWidth * mHeight;\r
+}\r
+\r
+void Sprite::setPosition(VectorT<S8> position) { mPosition = position; }\r
+\r
+void Sprite::setNextAnimFrame()\r
+{\r
+ if(!mAnimPtr)\r
+ {\r
+ return;\r
+ }\r
+\r
+ mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+ mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+\r
+ //check this frame and see if it is really a command. If so, execute command code and call the script object\r
+ //to let it know about the command\r
+ switch(mCurrentFrame)\r
+ {\r
+ case eAnimCommand_Move:\r
+ if(mInterface)\r
+ {\r
+ mInterface->animCommand(this, eAnimCommand_Move);\r
+ }\r
+ break;\r
+\r
+ case eAnimCommand_Trait:\r
+ setTraits(mAnimPtr[mCurrentAnim + 1]);\r
+ break;\r
+\r
+ case eAnimCommand_Stop:\r
+ if(mInterface)\r
+ {\r
+ mInterface->animCommand(this, eAnimCommand_Stop);\r
+ }\r
+ else\r
+ {\r
+ //don't allow the current frame to be displayed (it's a command frame)\r
+ mCurrentAnim -= 2;\r
+ mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+ mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+ }\r
+ return;\r
+ break;\r
+\r
+ case eAnimCommand_LoopToAnimFrame:\r
+ mCurrentAnim = mAnimPtr[mCurrentAnim + 1];\r
+ mCurrentFrame = mAnimPtr[mCurrentAnim];\r
+ mCurrentTime = mAnimPtr[mCurrentAnim + 1];\r
+\r
+ if(mInterface)\r
+ {\r
+ mInterface->animCommand(this, eAnimCommand_LoopToAnimFrame);\r
+ }\r
+ \r
+ //the anim has been set so don't increment it\r
+ return;\r
+ break;\r
+ }\r
+\r
+ //anim command come in pairs of 2 (frame number, time) or (anim command, parameter)\r
+ mCurrentAnim += 2;\r
+}\r
+\r
+\r