diff options
Diffstat (limited to 'engines/draci/animation.cpp')
-rw-r--r-- | engines/draci/animation.cpp | 91 |
1 files changed, 79 insertions, 12 deletions
diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp index 74e876401d..83a21ee543 100644 --- a/engines/draci/animation.cpp +++ b/engines/draci/animation.cpp @@ -28,8 +28,9 @@ namespace Draci { -Animation::Animation(DraciEngine *vm) : _vm(vm) { +Animation::Animation(DraciEngine *vm, int index) : _vm(vm) { _id = kUnused; + _index = index; _z = 0; _relX = 0; _relY = 0; @@ -201,6 +202,11 @@ void Animation::setPlaying(bool playing) { } void Animation::setScaleFactors(double scaleX, double scaleY) { + + debugC(5, kDraciAnimationDebugLevel, + "Setting scaling factors on anim %d (scaleX: %.3f scaleY: %.3f)", + _id, scaleX, scaleY); + markDirtyRect(_vm->_screen->getSurface()); _scaleX = scaleX; @@ -211,6 +217,14 @@ void Animation::addFrame(Drawable *frame) { _frames.push_back(frame); } +int Animation::getIndex() { + return _index; +} + +void Animation::setIndex(int index) { + _index = index; +} + Drawable *Animation::getFrame(int frameNum) { // If no argument is passed, return the current frame @@ -235,7 +249,10 @@ void Animation::deleteFrames() { Animation *AnimationManager::addAnimation(int id, uint z, bool playing) { - Animation *anim = new Animation(_vm); + // Increment animation index + ++_lastIndex; + + Animation *anim = new Animation(_vm, _lastIndex); anim->setID(id); anim->setZ(z); @@ -249,26 +266,26 @@ Animation *AnimationManager::addAnimation(int id, uint z, bool playing) { void AnimationManager::play(int id) { Animation *anim = getAnimation(id); - // Mark the first frame dirty so it gets displayed - anim->markDirtyRect(_vm->_screen->getSurface()); - if (anim) { + // Mark the first frame dirty so it gets displayed + anim->markDirtyRect(_vm->_screen->getSurface()); + anim->setPlaying(true); - debugC(5, kDraciAnimationDebugLevel, "Playing animation %d...", id); + debugC(3, kDraciAnimationDebugLevel, "Playing animation %d...", id); } } void AnimationManager::stop(int id) { Animation *anim = getAnimation(id); - // Clean up the last frame that was drawn before stopping - anim->markDirtyRect(_vm->_screen->getSurface()); - if (anim) { + // Clean up the last frame that was drawn before stopping + anim->markDirtyRect(_vm->_screen->getSurface()); + anim->setPlaying(false); - debugC(5, kDraciAnimationDebugLevel, "Stopping animation %d...", id); + debugC(3, kDraciAnimationDebugLevel, "Stopping animation %d...", id); } } @@ -298,7 +315,11 @@ void AnimationManager::insertAnimation(Animation *animObj) { } void AnimationManager::addOverlay(Drawable *overlay, uint z) { - Animation *anim = new Animation(_vm); + // Since this is an overlay, we don't need it to be deleted + // when the GPL Release command is invoked so we pass the index + // as kIgnoreIndex + Animation *anim = new Animation(_vm, kIgnoreIndex); + anim->setID(kOverlayImage); anim->setZ(z); anim->setPlaying(true); @@ -362,17 +383,38 @@ void AnimationManager::deleteAnimation(int id) { Common::List<Animation *>::iterator it; + int index = -1; + + // Iterate for the first time to delete the animation for (it = _animations.begin(); it != _animations.end(); ++it) { if ((*it)->getID() == id) { (*it)->deleteFrames(); _animations.erase(it); + + // Remember index of the deleted animation + index = (*it)->getIndex(); + + debugC(3, kDraciAnimationDebugLevel, "Deleting animation %d...", id); + break; } } + + // Iterate the second time to decrease indexes greater than the deleted animation index + for (it = _animations.begin(); it != _animations.end(); ++it) { + if ((*it)->getIndex() == index && (*it)->getIndex() != kIgnoreIndex) { + (*it)->setIndex(index-1); + } + } + + // Decrement index of last animation + _lastIndex -= 1; } void AnimationManager::deleteOverlays() { + debugC(3, kDraciAnimationDebugLevel, "Deleting overlays..."); + Common::List<Animation *>::iterator it; for (it = _animations.begin(); it != _animations.end(); ++it) { @@ -384,7 +426,9 @@ void AnimationManager::deleteOverlays() { } void AnimationManager::deleteAll() { - + + debugC(3, kDraciAnimationDebugLevel, "Deleting all animations..."); + Common::List<Animation *>::iterator it; for (it = _animations.begin(); it != _animations.end(); ++it) { @@ -392,6 +436,29 @@ void AnimationManager::deleteAll() { } _animations.clear(); + + _lastIndex = -1; +} + +int AnimationManager::getLastIndex() { + return _lastIndex; +} + +void AnimationManager::deleteAfterIndex(int index) { + + Common::List<Animation *>::iterator it; + + for (it = _animations.begin(); it != _animations.end(); ++it) { + if ((*it)->getIndex() > index) { + + debugC(3, kDraciAnimationDebugLevel, "Deleting animation %d...", (*it)->getID()); + + (*it)->deleteFrames(); + _animations.erase(it); + } + } + + _lastIndex = index; } } |