From da8bad0ef528ecb23dc82bcd3c1e30aef0a3b6ed Mon Sep 17 00:00:00 2001 From: Denis Kasak Date: Thu, 6 Aug 2009 03:52:08 +0000 Subject: Made the game behave properly and safe when clicking on objects multiple times during talking or executing look/use scripts. Previously, the loop could be called nested arbitrarily many times. svn-id: r43081 --- engines/draci/game.cpp | 60 +++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 28 deletions(-) (limited to 'engines/draci') diff --git a/engines/draci/game.cpp b/engines/draci/game.cpp index d8152b0fcb..3e3162e543 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -262,37 +262,41 @@ void Game::loop() { Animation *titleAnim = _vm->_anims->getAnimation(kTitleText); Text *title = reinterpret_cast(titleAnim->getFrame()); - // If there is an object under the cursor, display its title and enable - // executing its look and use scripts - if (curObject != kObjectNotFound) { - // Mark dirty rectangle to update the text - titleAnim->markDirtyRect(surface); - - // Set the title for the current object - title->setText(obj->_title); - - // Move the title to the correct place (just above the cursor) - int newX = surface->centerOnX(x, title->getWidth()); - int newY = surface->centerOnY(y - smallFontHeight / 2, title->getHeight() * 2); - titleAnim->setRelative(newX, newY); - - // HACK: Test running look and use scripts - if (_vm->_mouse->lButtonPressed()) { - _vm->_mouse->lButtonSet(false); - _vm->_script->run(obj->_program, obj->_look); + if (_loopStatus == kStatusOrdinary) { + // If there is an object under the cursor, display its title and enable + // executing its look and use scripts + if (curObject != kObjectNotFound) { + // Mark dirty rectangle to update the text + titleAnim->markDirtyRect(surface); + + // Set the title for the current object + title->setText(obj->_title); + + // Move the title to the correct place (just above the cursor) + int newX = surface->centerOnX(x, title->getWidth()); + int newY = surface->centerOnY(y - smallFontHeight / 2, title->getHeight() * 2); + titleAnim->setRelative(newX, newY); + + if (_loopSubstatus == kStatusOrdinary) { + // HACK: Test running look and use scripts + if (_vm->_mouse->lButtonPressed()) { + _vm->_mouse->lButtonSet(false); + _vm->_script->run(obj->_program, obj->_look); + } + + if (_vm->_mouse->rButtonPressed()) { + _vm->_mouse->rButtonSet(false); + _vm->_script->run(obj->_program, obj->_use); + } + } + } else { + // If there is no object under the cursor, just delete the previous title + titleAnim->markDirtyRect(surface); + title->setText(""); } - if (_vm->_mouse->rButtonPressed()) { - _vm->_mouse->rButtonSet(false); - _vm->_script->run(obj->_program, obj->_use); - } - } else { - // If there is no object under the cursor, just delete the previous title - titleAnim->markDirtyRect(surface); - title->setText(""); + debugC(2, kDraciAnimationDebugLevel, "Anim under cursor: %d", animUnderCursor); } - - debugC(2, kDraciAnimationDebugLevel, "Anim under cursor: %d", animUnderCursor); } // Handle character talking (if there is any) -- cgit v1.2.3