summaryrefslogtreecommitdiff
path: root/src/resources/sprite/animatedsprite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/resources/sprite/animatedsprite.cpp')
-rw-r--r--src/resources/sprite/animatedsprite.cpp485
1 files changed, 0 insertions, 485 deletions
diff --git a/src/resources/sprite/animatedsprite.cpp b/src/resources/sprite/animatedsprite.cpp
deleted file mode 100644
index 9d7186335..000000000
--- a/src/resources/sprite/animatedsprite.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2004-2009 The Mana World Development Team
- * Copyright (C) 2009-2010 The Mana Developers
- * Copyright (C) 2011-2017 The ManaPlus Developers
- *
- * This file is part of The ManaPlus Client.
- *
- * 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 2 of the License, or
- * 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/>.
- */
-
-#include "resources/sprite/animatedsprite.h"
-
-#include "const/resources/spriteaction.h"
-
-#include "render/graphics.h"
-
-#include "resources/action.h"
-#include "resources/delayedmanager.h"
-
-#include "resources/animation/animation.h"
-
-#include "resources/image/image.h"
-
-#include "resources/loaders/spritedefloader.h"
-
-#include "resources/resourcemanager/resourcemanager.h"
-
-#include "resources/sprite/animationdelayload.h"
-
-#include "utils/delete2.h"
-#include "utils/likely.h"
-#include "utils/mrand.h"
-
-#include "debug.h"
-
-bool AnimatedSprite::mEnableCache = false;
-
-AnimatedSprite::AnimatedSprite(SpriteDef *restrict const sprite) :
- mDirection(SpriteDirection::DOWN),
- mLastTime(0),
- mFrameIndex(0),
- mFrameTime(0),
- mSprite(sprite),
- mAction(nullptr),
- mAnimation(nullptr),
- mFrame(nullptr),
- mNumber(100),
- mNumber1(100),
- mDelayLoad(nullptr),
- mTerminated(false)
-{
- mAlpha = 1.0F;
-
- // Take possession of the sprite
- if (mSprite != nullptr)
- mSprite->incRef();
-}
-
-AnimatedSprite *AnimatedSprite::load(const std::string &restrict filename,
- const int variant)
-{
- SpriteDef *restrict const s = Loader::getSprite(
- filename, variant);
- if (s == nullptr)
- return nullptr;
- AnimatedSprite *restrict const as = new AnimatedSprite(s);
-#ifdef DEBUG_ANIMATIONS
- as->setSpriteName(filename);
-#endif // DEBUG_ANIMATIONS
-
- as->play(SpriteAction::STAND);
- s->decRef();
- return as;
-}
-
-AnimatedSprite *AnimatedSprite::delayedLoad(const std::string &restrict
- filename,
- const int variant)
-{
- if (!mEnableCache)
- return load(filename, variant);
- Resource *restrict const res = ResourceManager::getFromCache(
- filename, variant);
- if (res != nullptr)
- {
- res->decRef();
- return load(filename, variant);
- }
-
- AnimatedSprite *restrict const as = new AnimatedSprite(nullptr);
-#ifdef DEBUG_ANIMATIONS
- as->setSpriteName(filename);
-#endif // DEBUG_ANIMATIONS
-
- as->play(SpriteAction::STAND);
- as->setDelayLoad(filename, variant);
- return as;
-}
-
-AnimatedSprite *AnimatedSprite::clone(const AnimatedSprite *restrict const
- anim)
-{
- if (anim == nullptr)
- return nullptr;
- AnimatedSprite *restrict const sprite = new AnimatedSprite(anim->mSprite);
-#ifdef DEBUG_ANIMATIONS
- sprite->setSpriteName(anim->getSpriteName());
-#endif // DEBUG_ANIMATIONS
-
- sprite->play(SpriteAction::STAND);
- return sprite;
-}
-
-AnimatedSprite::~AnimatedSprite()
-{
- if (mSprite != nullptr)
- {
- mSprite->decRef();
- mSprite = nullptr;
- }
- if (mDelayLoad != nullptr)
- {
- mDelayLoad->clearSprite();
- DelayedManager::removeDelayLoad(mDelayLoad);
- delete2(mDelayLoad);
- }
-}
-
-bool AnimatedSprite::reset() restrict2
-{
- const bool ret = mFrameIndex !=0 ||
- mFrameTime != 0 ||
- mLastTime != 0;
-
- mFrameIndex = 0;
- mFrameTime = 0;
- mLastTime = 0;
-
- if (mAnimation != nullptr)
- mFrame = &mAnimation->mFrames[0];
- else
- mFrame = nullptr;
- return ret;
-}
-
-bool AnimatedSprite::play(const std::string &restrict spriteAction) restrict2
-{
- if (mSprite == nullptr)
- {
- if (mDelayLoad == nullptr)
- return false;
- mDelayLoad->setAction(spriteAction);
- return true;
- }
-
- const Action *const action = mSprite->getAction(spriteAction, mNumber);
- if (action == nullptr)
- return false;
-
- mAction = action;
- const Animation *const animation = mAction->getAnimation(mDirection);
-
- if ((animation != nullptr) &&
- animation != mAnimation &&
- animation->getLength() > 0)
- {
- mAnimation = animation;
- reset();
-
- return true;
- }
-
- return false;
-}
-
-bool AnimatedSprite::update(const int time) restrict2
-{
- // Avoid freaking out at first frame or when tick_time overflows
- if (A_UNLIKELY(time < mLastTime || mLastTime == 0))
- mLastTime = time;
-
- // If not enough time has passed yet, do nothing
- if (time <= mLastTime || (mAnimation == nullptr))
- return false;
-
- const unsigned int dt = time - mLastTime;
- mLastTime = time;
-
- const Animation *restrict const animation = mAnimation;
- const Frame *restrict const frame = mFrame;
-
- if (A_UNLIKELY(!updateCurrentAnimation(dt)))
- {
- // Animation finished, reset to default
- play(SpriteAction::STAND);
- mTerminated = true;
- }
-
- // Make sure something actually changed
- return animation != mAnimation || frame != mFrame;
-}
-
-bool AnimatedSprite::updateCurrentAnimation(const unsigned int time) restrict2
-{
- // move code from Animation::isTerminator(*mFrame)
- if (mFrame == nullptr ||
- mAnimation == nullptr ||
- (mFrame->image == nullptr && mFrame->type == FrameType::ANIMATION))
- {
- return false;
- }
-
- mFrameTime += time;
-
- while ((mFrameTime > CAST_U32(mFrame->delay) &&
- mFrame->delay > 0) ||
- (mFrame->type != FrameType::ANIMATION &&
- mFrame->type != FrameType::PAUSE))
- {
- bool fail(true);
- mFrameTime -= CAST_U32(mFrame->delay);
- mFrameIndex++;
-
- if (mFrameIndex >= CAST_U32(mAnimation->getLength()))
- mFrameIndex = 0;
-
- mFrame = &mAnimation->mFrames[mFrameIndex];
- if (mFrame->type == FrameType::LABEL &&
- !mFrame->nextAction.empty())
- {
- fail = false;
- }
- else if (mFrame->type == FrameType::GOTO &&
- !mFrame->nextAction.empty())
- {
- const int rand = mFrame->rand;
- if (rand == 100 ||
- ((rand != 0) && rand >= mrand() % 100))
- {
- for (size_t i = 0; i < mAnimation->getLength(); i ++)
- {
- const Frame *restrict const frame =
- &mAnimation->mFrames[i];
- if (frame->type == FrameType::LABEL &&
- mFrame->nextAction == frame->nextAction)
- {
- mFrameIndex = CAST_U32(i);
- if (mFrameIndex >= CAST_U32(
- mAnimation->getLength()))
- {
- mFrameIndex = 0;
- }
-
- mFrame = &mAnimation->mFrames[mFrameIndex];
-
- fail = false;
- break;
- }
- }
- }
- else
- {
- fail = false;
- }
- }
- else if (mFrame->type == FrameType::JUMP &&
- !mFrame->nextAction.empty())
- {
- const int rand = mFrame->rand;
- if (rand == 100 ||
- ((rand != 0) && rand >= mrand() % 100))
- {
- play(mFrame->nextAction);
- return true;
- }
- }
- // copy code from Animation::isTerminator(*mFrame)
- else if ((mFrame->image == nullptr) &&
- mFrame->type == FrameType::ANIMATION)
- {
- const int rand = mFrame->rand;
- if (rand == 100 ||
- ((rand != 0) && rand >= mrand() % 100))
- {
- mAnimation = nullptr;
- mFrame = nullptr;
- return false;
- }
- }
- else
- {
- const int rand = mFrame->rand;
- if (rand == 100 ||
- mFrameIndex >= CAST_U32(mAnimation->getLength()))
- {
- fail = false;
- }
- else
- {
- if ((rand != 0) && mrand() % 100 <= rand)
- fail = false;
- }
- }
- if (fail)
- {
- if (mFrame != nullptr)
- mFrameTime = mFrame->delay + 1;
- else
- mFrameTime ++;
- }
- }
- return true;
-}
-
-void AnimatedSprite::draw(Graphics *restrict const graphics,
- const int posX,
- const int posY) const restrict2
-{
- FUNC_BLOCK("AnimatedSprite::draw", 1)
- if ((mFrame == nullptr) || (mFrame->image == nullptr))
- return;
-
- Image *restrict const image = mFrame->image;
- image->setAlpha(mAlpha);
- graphics->drawImage(image,
- posX + mFrame->offsetX, posY + mFrame->offsetY);
-}
-
-void AnimatedSprite::drawRescaled(Graphics *restrict const graphics,
- const int posX,
- const int posY,
- const int dx,
- const int dy) const restrict2
-{
- if (mFrame == nullptr ||
- mFrame->image == nullptr)
- {
- return;
- }
-
- Image *restrict const image = mFrame->image;
- image->setAlpha(mAlpha);
- graphics->drawRescaledImage(image,
- posX + mFrame->offsetX,
- posY + mFrame->offsetY,
- dx,
- dy);
-}
-
-void AnimatedSprite::drawRaw(Graphics *restrict const graphics,
- const int posX,
- const int posY) const restrict2
-{
- if ((mFrame == nullptr) || (mFrame->image == nullptr))
- return;
-
- Image *restrict const image = mFrame->image;
- image->setAlpha(mAlpha);
- graphics->drawImage(image,
- posX,
- posY);
-}
-
-bool AnimatedSprite::setSpriteDirection(const SpriteDirection::Type direction)
- restrict2
-{
- if (mDirection != direction)
- {
- mDirection = direction;
-
- if (mAction == nullptr)
- return false;
-
- const Animation *restrict const animation =
- mAction->getAnimation(mDirection);
-
- if ((animation != nullptr) &&
- animation != mAnimation &&
- animation->getLength() > 0)
- {
- mAnimation = animation;
- reset();
- }
-
- return true;
- }
-
- return false;
-}
-
-unsigned int AnimatedSprite::getFrameCount() const restrict2
-{
- if (mAnimation != nullptr)
- return CAST_U32(mAnimation->getLength());
- return 0;
-}
-
-int AnimatedSprite::getWidth() const restrict2
-{
- if ((mFrame != nullptr) && (mFrame->image != nullptr))
- return mFrame->image->mBounds.w;
- return 0;
-}
-
-int AnimatedSprite::getHeight() const restrict2
-{
- if ((mFrame != nullptr) && (mFrame->image != nullptr))
- return mFrame->image->mBounds.h;
- return 0;
-}
-
-std::string AnimatedSprite::getIdPath() const restrict2
-{
- if (mSprite == nullptr)
- return "";
- return mSprite->mIdPath;
-}
-
-const Image* AnimatedSprite::getImage() const restrict2 noexcept2
-{
- return mFrame != nullptr ? mFrame->image : nullptr;
-}
-
-void AnimatedSprite::setAlpha(float alpha) restrict2
-{
- mAlpha = alpha;
-
- if (mFrame != nullptr)
- {
- Image *restrict const image = mFrame->image;
- if (image != nullptr)
- image->setAlpha(mAlpha);
- }
-}
-
-const void *AnimatedSprite::getHash() const restrict2
-{
- if (mFrame != nullptr)
- return mFrame;
- return this;
-}
-
-bool AnimatedSprite::updateNumber(const unsigned num) restrict2
-{
- if (mSprite == nullptr)
- return false;
-
- if (mNumber1 != num)
- {
- mNumber1 = num;
- mNumber = mSprite->findNumber(num);
- if (mNumber == 0u)
- {
- mNumber = 100;
- return false;
- }
- return true;
- }
- return false;
-}
-
-void AnimatedSprite::setDelayLoad(const std::string &restrict filename,
- const int variant) restrict2
-{
- if (mDelayLoad != nullptr)
- {
- mDelayLoad->clearSprite();
- DelayedManager::removeDelayLoad(mDelayLoad);
- delete mDelayLoad;
- }
- mDelayLoad = new AnimationDelayLoad(filename, variant, this);
- DelayedManager::addDelayedAnimation(mDelayLoad);
-}