aboutsummaryrefslogtreecommitdiff
path: root/saga/scene.cpp
diff options
context:
space:
mode:
authorTorbjörn Andersson2004-10-16 07:46:52 +0000
committerTorbjörn Andersson2004-10-16 07:46:52 +0000
commitcebce0f5361cc58a4b6c232d042d2daebb2b4088 (patch)
tree743b49b6db138d9506f3367dd3df1412f6e1c78b /saga/scene.cpp
parent4840c16c1b40146ce4268e3599f6ab3115b51ce4 (diff)
downloadscummvm-rg350-cebce0f5361cc58a4b6c232d042d2daebb2b4088.tar.gz
scummvm-rg350-cebce0f5361cc58a4b6c232d042d2daebb2b4088.tar.bz2
scummvm-rg350-cebce0f5361cc58a4b6c232d042d2daebb2b4088.zip
Introduced script events to fix the "actors appear before fade-out" bug.
There are some minor music-related changes here as well, but that's just cleanup. svn-id: r15567
Diffstat (limited to 'saga/scene.cpp')
-rw-r--r--saga/scene.cpp89
1 files changed, 42 insertions, 47 deletions
diff --git a/saga/scene.cpp b/saga/scene.cpp
index 2bf0ccd110..e104b8e7f4 100644
--- a/saga/scene.cpp
+++ b/saga/scene.cpp
@@ -530,6 +530,21 @@ int Scene::loadScene(int scene_num, int load_flag, R_SCENE_PROC scene_proc, R_SC
event.duration = 0;
q_event = _vm->_events->chain(q_event, &event);
+ // Start the scene pre script, but stay with black palette
+ if (_desc.startScriptNum > 0) {
+ event.type = R_ONESHOT_EVENT;
+ event.code = R_SCRIPT_EVENT;
+ event.op = EVENT_BLOCKING;
+ event.time = 0;
+ event.param = _desc.startScriptNum;
+ event.param2 = 0; // Action
+ event.param3 = _sceneNumber; // Object
+ event.param4 = 0; // With Object - TODO: should be 'entrance'
+ event.param5 = 0; // Actor
+
+ _vm->_events->chain(q_event, &event);
+ }
+
// Fade in from black to the scene background palette
event.type = R_IMMEDIATE_EVENT;
event.code = R_PAL_EVENT;
@@ -946,9 +961,26 @@ int Scene::defaultScene(int param, R_SCENE_INFO *scene_info) {
switch (param) {
case SCENE_BEGIN:
- _vm->_music->stop();
_vm->_sound->stopVoice();
+ if (_desc.musicRN >= 0) {
+ event.type = R_ONESHOT_EVENT;
+ event.code = R_MUSIC_EVENT;
+ event.param = _desc.musicRN;
+ event.param2 = R_MUSIC_DEFAULT;
+ event.op = EVENT_PLAY;
+ event.time = 0;
+
+ _vm->_events->queue(&event);
+ } else {
+ event.type = R_ONESHOT_EVENT;
+ event.code = R_MUSIC_EVENT;
+ event.op = EVENT_STOP;
+ event.time = 0;
+
+ _vm->_events->queue(&event);
+ }
+
// Set scene background
event.type = R_ONESHOT_EVENT;
event.code = R_BG_EVENT;
@@ -978,56 +1010,19 @@ int Scene::defaultScene(int param, R_SCENE_INFO *scene_info) {
_vm->_anim->setFlag(0, ANIM_LOOP);
_vm->_anim->play(0, 0);
- // Start scene scripts
- if (_desc.startScriptNum > 0) {
- R_SCRIPT_THREAD *_startScriptThread;
-
- debug(0, "Starting start script #%d", _desc.startScriptNum);
-
- _startScriptThread = _vm->_script->SThreadCreate();
- if (_startScriptThread == NULL) {
- _vm->_console->print("Thread creation failed.");
- break;
- }
-
- _startScriptThread->threadVars[kVarAction] = 0;
- _startScriptThread->threadVars[kVarObject] = TO_LE_16(_sceneNumber);
- _startScriptThread->threadVars[kVarWithObject] = 0; // TOTO: entrance
- _startScriptThread->threadVars[kVarActor] = 0;
-
- _vm->_script->SThreadExecute(_startScriptThread, _desc.startScriptNum);
- _vm->_script->SThreadCompleteThread();
- }
-
- if (_desc.musicRN >= 0) {
+ // Start the scene main script
+ if (_desc.sceneScriptNum > 0) {
event.type = R_ONESHOT_EVENT;
- event.code = R_MUSIC_EVENT;
- event.param = _desc.musicRN;
- event.param2 = R_MUSIC_DEFAULT;
- event.op = EVENT_PLAY;
+ event.code = R_SCRIPT_EVENT;
+ event.op = EVENT_NONBLOCKING;
event.time = 0;
+ event.param = _desc.sceneScriptNum;
+ event.param2 = 0; // Action
+ event.param3 = _sceneNumber; // Object
+ event.param4 = 0; // With Object - TODO: should be 'entrance'
+ event.param5 = 0; // Actor - TODO: should be VERB_ENTER
_vm->_events->queue(&event);
- } else
- _vm->_music->stop();
-
- if (_desc.sceneScriptNum > 0) {
- R_SCRIPT_THREAD *_sceneScriptThread;
-
- debug(0, "Starting scene script #%d", _desc.sceneScriptNum);
-
- _sceneScriptThread = _vm->_script->SThreadCreate();
- if (_sceneScriptThread == NULL) {
- _vm->_console->print("Thread creation failed.");
- break;
- }
-
- _sceneScriptThread->threadVars[kVarAction] = 0;
- _sceneScriptThread->threadVars[kVarObject] = TO_LE_16(_sceneNumber);
- _sceneScriptThread->threadVars[kVarWithObject] = 0; // TODO: entrance
- _sceneScriptThread->threadVars[kVarActor] = 0; // TODO: VERB_ENTER
-
- _vm->_script->SThreadExecute(_sceneScriptThread, _desc.sceneScriptNum);
}
debug(0, "Scene started");