aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Špalek2010-04-01 22:01:40 +0000
committerRobert Špalek2010-04-01 22:01:40 +0000
commit2d8b25f6569432f6c62d11763071cbde0db8c7aa (patch)
tree075175b8cbbb3e66d24c8b867b8a9a7da02c633a
parentd38f71c1e45f4b45f2e11e02315957d40657f3f3 (diff)
downloadscummvm-rg350-2d8b25f6569432f6c62d11763071cbde0db8c7aa.tar.gz
scummvm-rg350-2d8b25f6569432f6c62d11763071cbde0db8c7aa.tar.bz2
scummvm-rg350-2d8b25f6569432f6c62d11763071cbde0db8c7aa.zip
Dragon History: fixing properly bug 2976774
The previous bugfix just hid the problem by removing an assert, but it might demonstrate itself in another way later. This is a proper bugfix. svn-id: r48460
-rw-r--r--engines/draci/animation.cpp10
-rw-r--r--engines/draci/animation.h8
-rw-r--r--engines/draci/game.cpp4
-rw-r--r--engines/draci/game.h2
4 files changed, 20 insertions, 4 deletions
diff --git a/engines/draci/animation.cpp b/engines/draci/animation.cpp
index ff1d07197f..e46582487c 100644
--- a/engines/draci/animation.cpp
+++ b/engines/draci/animation.cpp
@@ -295,6 +295,11 @@ void Animation::del() {
}
void AnimationManager::pauseAnimations() {
+ if (_animationPauseCounter++) {
+ // Already paused
+ return;
+ }
+
Common::List<Animation *>::iterator it;
for (it = _animations.begin(); it != _animations.end(); ++it) {
@@ -308,6 +313,11 @@ void AnimationManager::pauseAnimations() {
}
void AnimationManager::unpauseAnimations() {
+ if (--_animationPauseCounter) {
+ // Still paused
+ return;
+ }
+
Common::List<Animation *>::iterator it;
for (it = _animations.begin(); it != _animations.end(); ++it) {
diff --git a/engines/draci/animation.h b/engines/draci/animation.h
index b6e6e9fa1b..1a7cb599cb 100644
--- a/engines/draci/animation.h
+++ b/engines/draci/animation.h
@@ -178,7 +178,7 @@ private:
class AnimationManager {
public:
- AnimationManager(DraciEngine *vm) : _vm(vm), _lastIndex(-1) {}
+ AnimationManager(DraciEngine *vm) : _vm(vm), _lastIndex(-1), _animationPauseCounter(0) {}
~AnimationManager() { deleteAll(); }
void insert(Animation *anim, bool allocateIndex);
@@ -214,6 +214,12 @@ private:
* See Animation::_index for details.
*/
int _lastIndex;
+
+ /** How many times the animations are paused.
+ * Needed because the animations can be paused once by entering the
+ * inventory and then again by entering the game menu. When they are
+ * unpaused the first time, they should be kept paused. */
+ int _animationPauseCounter;
};
} // End of namespace Draci
diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp
index aedc3b9a87..d985c2dee0 100644
--- a/engines/draci/game.cpp
+++ b/engines/draci/game.cpp
@@ -332,8 +332,8 @@ void Game::handleInventoryLoop() {
// animation ID. In this way, we obtain its itemID.
if (_animUnderCursor != NULL && _animUnderCursor != _inventoryAnim && _animUnderCursor->getID() != kOverlayImage) {
_itemUnderCursor = getItem(kInventoryItemsID - _animUnderCursor->getID());
- if (_itemUnderCursor != NULL)
- assert(_itemUnderCursor->_anim == _animUnderCursor);
+ assert(_itemUnderCursor != NULL);
+ assert(_itemUnderCursor->_anim == _animUnderCursor);
} else {
_itemUnderCursor = NULL;
}
diff --git a/engines/draci/game.h b/engines/draci/game.h
index cd1e5c5dd6..3d02489da7 100644
--- a/engines/draci/game.h
+++ b/engines/draci/game.h
@@ -252,7 +252,7 @@ public:
int getItemStatus(int itemID) const { return _itemStatus[itemID]; }
void setItemStatus(int itemID, int status) { _itemStatus[itemID] = status; }
- GameItem *getItem(int id) { return id >= 0 ? &_items[id] : NULL; }
+ GameItem *getItem(int id) { return id >= 0 && id < (int) _info._numItems ? &_items[id] : NULL; }
GameItem *getCurrentItem() const { return _currentItem; }
void setCurrentItem(GameItem *item) { _currentItem = item; }
void removeItem(GameItem *item);