[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