[Scummvm-cvs-logs] CVS: scummvm/saga events.cpp,1.26,1.27 events.h,1.6,1.7 scene.cpp,1.45,1.46
Torbjörn Andersson
eriktorbjorn at users.sourceforge.net
Sat Oct 16 00:48:00 CEST 2004
Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2159
Modified Files:
events.cpp events.h scene.cpp
Log Message:
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.
Index: events.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/events.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- events.cpp 4 Oct 2004 23:09:38 -0000 1.26
+++ events.cpp 16 Oct 2004 07:46:52 -0000 1.27
@@ -261,6 +261,7 @@
break;
}
break;
+ case R_SCRIPT_EVENT:
case R_BG_EVENT:
case R_INTERFACE_EVENT:
handleOneShot(event);
@@ -280,6 +281,7 @@
int Events::handleOneShot(R_EVENT *event) {
R_SURFACE *back_buf;
+ R_SCRIPT_THREAD *sthread;
static SCENE_BGINFO bginfo;
@@ -311,7 +313,9 @@
_vm->_sndRes->playVoice(event->param);
break;
case R_MUSIC_EVENT:
- _vm->_music->play(event->param, event->param2);
+ _vm->_music->stop();
+ if (event->op == EVENT_PLAY)
+ _vm->_music->play(event->param, event->param2);
break;
case R_BG_EVENT:
{
@@ -384,6 +388,26 @@
break;
}
break;
+ case R_SCRIPT_EVENT:
+ debug(0, "Starting start script #%d", event->param);
+
+ sthread = _vm->_script->SThreadCreate();
+ if (sthread == NULL) {
+ _vm->_console->print("Thread creation failed.");
+ break;
+ }
+
+ sthread->threadVars[kVarAction] = TO_LE_16(event->param2);
+ sthread->threadVars[kVarObject] = TO_LE_16(event->param3);
+ sthread->threadVars[kVarWithObject] = TO_LE_16(event->param4);
+ sthread->threadVars[kVarActor] = TO_LE_16(event->param5);
+
+ _vm->_script->SThreadExecute(sthread, event->param);
+
+ if (event->op == EVENT_BLOCKING)
+ _vm->_script->SThreadCompleteThread();
+
+ break;
default:
break;
}
Index: events.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/events.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- events.h 11 Aug 2004 22:27:38 -0000 1.6
+++ events.h 16 Oct 2004 07:46:52 -0000 1.7
@@ -52,7 +52,8 @@
R_TRANSITION_EVENT,
R_INTERFACE_EVENT,
R_CONSOLE_EVENT,
- R_ACTOR_EVENT
+ R_ACTOR_EVENT,
+ R_SCRIPT_EVENT
};
enum R_EVENT_OPS {
@@ -79,6 +80,9 @@
EVENT_DEACTIVATE,
// ACTOR events
EVENT_MOVE = 1,
+ // SCRIPT events
+ EVENT_BLOCKING = 1,
+ EVENT_NONBLOCKING = 2,
// CONTINUOUS events
// PALETTE events
@@ -100,6 +104,9 @@
int op; // Event operation
long param; // Optional event parameter
long param2;
+ long param3;
+ long param4;
+ long param5;
void *data; // Optional event data
long time; // Elapsed time until event
long duration; // Duration of event
Index: scene.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/scene.cpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- scene.cpp 12 Oct 2004 11:45:53 -0000 1.45
+++ scene.cpp 16 Oct 2004 07:46:52 -0000 1.46
@@ -530,6 +530,21 @@
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 @@
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 @@
_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");
More information about the Scummvm-git-logs
mailing list