STARK: Add support for calling dialogs

This commit is contained in:
Bastien Bouclet 2015-01-11 15:25:43 +01:00
parent c93098e7af
commit a75de69533
10 changed files with 175 additions and 29 deletions

View file

@ -24,6 +24,7 @@
#include "engines/stark/resources/command.h"
#include "engines/stark/resources/item.h"
#include "engines/stark/services/dialogplayer.h"
#include "engines/stark/services/global.h"
#include "engines/stark/services/services.h"
#include "engines/stark/xrcreader.h"
@ -42,7 +43,8 @@ Script::Script(Resource *parent, byte subType, uint16 index, const Common::Strin
_shouldResetGameSpeed(false),
_enabled(false),
_nextCommand(nullptr),
_pauseTimeLeft(-1) {
_pauseTimeLeft(-1),
_suspendingResource(nullptr) {
_type = TYPE;
}
@ -152,7 +154,7 @@ bool Script::shouldExecute(uint32 callMode) {
}
bool Script::isSuspended() {
return _pauseTimeLeft >= 0;
return _pauseTimeLeft >= 0 || _suspendingResource;
}
void Script::updateSuspended() {
@ -160,11 +162,28 @@ void Script::updateSuspended() {
// Decrease the remaining pause time
Global *global = StarkServices::instance().global;
_pauseTimeLeft -= global->getMillisecondsPerGameloop();
} else {
_pauseTimeLeft = -1;
}
if (_pauseTimeLeft < 0) {
if (_suspendingResource) {
// Check if the suspending resource is still active
switch (_suspendingResource->getType().get()) {
case ResourceType::kDialog: {
DialogPlayer *dialogPlayer = StarkServices::instance().dialogPlayer;
if (!dialogPlayer->isRunning()) {
// Resume the script execution if the dialog is complete
_suspendingResource = nullptr;
}
break;
}
default:
error("Unhandled suspending resource type %s", _suspendingResource->getType().getName());
}
}
if (!isSuspended()) {
// Resume to the next command
_pauseTimeLeft = -1;
_nextCommand = _nextCommand->nextCommand();
}
}
@ -173,6 +192,10 @@ void Script::pause(int32 msecs) {
_pauseTimeLeft = msecs;
}
void Script::suspend(Resource *cause) {
_suspendingResource = cause;
}
void Script::execute(uint32 callMode) {
if (!shouldExecute(callMode)) {
return;