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
This commit is contained in:
Denis Kasak 2009-08-06 03:52:08 +00:00
parent e632106169
commit da8bad0ef5

View File

@ -262,37 +262,41 @@ void Game::loop() {
Animation *titleAnim = _vm->_anims->getAnimation(kTitleText);
Text *title = reinterpret_cast<Text *>(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);
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);
// 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);
// 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 (_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)