[Scummvm-cvs-logs] SF.net SVN: scummvm: [28763] scummvm/trunk/engines/saga

sev at users.sourceforge.net sev at users.sourceforge.net
Thu Aug 30 19:55:19 CEST 2007


Revision: 28763
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28763&view=rev
Author:   sev
Date:     2007-08-30 10:55:19 -0700 (Thu, 30 Aug 2007)

Log Message:
-----------
Proper implementation of intro and credits in IHNM

Modified Paths:
--------------
    scummvm/trunk/engines/saga/animation.cpp
    scummvm/trunk/engines/saga/animation.h
    scummvm/trunk/engines/saga/ihnm_introproc.cpp
    scummvm/trunk/engines/saga/scene.h

Modified: scummvm/trunk/engines/saga/animation.cpp
===================================================================
--- scummvm/trunk/engines/saga/animation.cpp	2007-08-29 16:05:06 UTC (rev 28762)
+++ scummvm/trunk/engines/saga/animation.cpp	2007-08-30 17:55:19 UTC (rev 28763)
@@ -78,7 +78,7 @@
 	_cutawayListLength = 0;
 }
 
-void Anim::playCutaway(int cut, bool fade) {
+int Anim::playCutaway(int cut, bool fade) {
 	debug(0, "playCutaway(%d, %d)", cut, fade);
 
 	bool startImmediately = false;
@@ -170,7 +170,7 @@
 
 	if (cutawaySlot == -1) {
 		warning("Could not allocate cutaway animation slot");
-		return;
+		return 0;
 	}
 	
 	// Some cutaways in IHNM have animResourceId equal to 0, which means that they only have
@@ -199,6 +199,8 @@
 
 		_vm->_events->queue(&event);
 	}
+
+	return MAX_ANIMATIONS + cutawaySlot;
 }
 
 void Anim::endCutaway(void) {
@@ -415,6 +417,13 @@
 	anim->cycles = cycles;
 }
 
+int Anim::getCycles(uint16 animId) {
+	if (animId >= MAX_ANIMATIONS && _cutawayAnimations[animId - MAX_ANIMATIONS] == NULL)
+		return 0;
+	
+	return getAnimation(animId)->cycles;
+}
+
 void Anim::play(uint16 animId, int vectorTime, bool playing) {
 	Event event;
 	Surface *backGroundSurface;
@@ -612,6 +621,14 @@
 	anim->frameTime = time;
 }
 
+int Anim::getFrameTime(uint16 animId) {
+	AnimationData *anim;
+
+	anim = getAnimation(animId);
+
+	return anim->frameTime;
+}
+
 int16 Anim::getCurrentFrame(uint16 animId) {
 	AnimationData *anim;
 

Modified: scummvm/trunk/engines/saga/animation.h
===================================================================
--- scummvm/trunk/engines/saga/animation.h	2007-08-29 16:05:06 UTC (rev 28762)
+++ scummvm/trunk/engines/saga/animation.h	2007-08-30 17:55:19 UTC (rev 28763)
@@ -115,7 +115,7 @@
 
 	void loadCutawayList(const byte *resourcePointer, size_t resourceLength);
 	void freeCutawayList(void);
-	void playCutaway(int cut, bool fade);
+	int playCutaway(int cut, bool fade);
 	void endCutaway(void);
 	void returnFromCutaway(void);
 	void clearCutaway(void);
@@ -140,6 +140,8 @@
 	void resume(uint16 animId, int cycles);
 	void resumeAll();
 	int16 getCurrentFrame(uint16 animId);
+	int getFrameTime(uint16 animId);
+	int getCycles(uint16 animId);
 
 	bool hasAnimation(uint16 animId) {
 		if (animId >= MAX_ANIMATIONS) {
@@ -169,7 +171,7 @@
 			}
 		}
 		if (_animations[animId] == NULL) {
-			error("validateAnimationId: animId=%i unassigned", animId);
+			error("validateAnimationId: animId=%i unassigned.", animId);
 		}
 	}
 

Modified: scummvm/trunk/engines/saga/ihnm_introproc.cpp
===================================================================
--- scummvm/trunk/engines/saga/ihnm_introproc.cpp	2007-08-29 16:05:06 UTC (rev 28762)
+++ scummvm/trunk/engines/saga/ihnm_introproc.cpp	2007-08-30 17:55:19 UTC (rev 28763)
@@ -31,142 +31,83 @@
 #include "saga/animation.h"
 #include "saga/events.h"
 #include "saga/interface.h"
+#include "saga/render.h"
 #include "saga/rscfile.h"
 #include "saga/sndres.h"
 #include "saga/music.h"
 
 #include "saga/scene.h"
 
+#include "common/events.h"
+
 namespace Saga {
 
-SceneResourceData IHNM_IntroMovie1RL[] = {
-	{30, 2, 0, 0, false},
-	{31, 14, 0, 0, false}
-};
+// IHNM cutaway intro resource IDs
+#define RID_IHNM_INTRO_CUTAWAYS 39
+#define RID_IHNMDEMO_INTRO_CUTAWAYS 25
 
-SceneDescription IHNM_IntroMovie1Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNM_IntroMovie1RL,
-	ARRAYSIZE(IHNM_IntroMovie1RL)
-};
+int Scene::IHNMStartProc() {
+	LoadSceneParams firstScene;
 
-SceneResourceData IHNM_IntroMovie2RL[] = {
-	{32, 2, 0, 0, false},
-	{33, 14, 0, 0, false}
-};
+	IHNMLoadCutaways();
 
-SceneDescription IHNM_IntroMovie2Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNM_IntroMovie2RL,
-	ARRAYSIZE(IHNM_IntroMovie2RL)
-};
+	_vm->_music->play(0, MUSIC_NORMAL);
 
-SceneResourceData IHNM_IntroMovie3RL[] = {
-	{34, 2, 0, 0, false},
-	{35, 14, 0, 0, false}
-};
+	if (_vm->getGameId() != GID_IHNM_DEMO) {
+		// Play Cyberdreams logo for 168 frames
+		if (!playTitle(0, -168, true)) {
+			// Play Dreamers Guild logo for 10 seconds
+			if (!playLoopingTitle(1, 10)) {
+				// Play the title music
+				_vm->_music->play(1, MUSIC_NORMAL);
+				// Play title screen
+				playTitle(2, 17);
+			}
+		}
+	} else {
+		_vm->_music->play(1, MUSIC_NORMAL);
+		playTitle(0, 10);
+		playTitle(2, 12);
+	}
 
-SceneDescription IHNM_IntroMovie3Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNM_IntroMovie3RL,
-	ARRAYSIZE(IHNM_IntroMovie3RL)
-};
+	_vm->_music->setVolume(0, 1000);
+	_vm->_anim->freeCutawayList();
 
-SceneResourceData IHNM_IntroMovie4RL[] = {
-	{1227, 2, 0, 0, false},
-	{1226, 14, 0, 0, false}
-};
+	// Queue first scene
+	firstScene.loadFlag = kLoadBySceneNumber;
+	firstScene.sceneDescriptor = -1;
+	firstScene.sceneDescription = NULL;
+	firstScene.sceneSkipTarget = true;
+	firstScene.sceneProc = NULL;
+	firstScene.transitionType = kTransitionFade;
+	firstScene.actorsEntrance = 0;
+	firstScene.chapter = -1;
 
-SceneDescription IHNM_IntroMovie4Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNM_IntroMovie4RL,
-	ARRAYSIZE(IHNM_IntroMovie4RL)
-};
+	_vm->_scene->queueScene(&firstScene);
 
-SceneResourceData IHNM_CreditsMovieRL[] = {
-	{37, 2, 0, 0, false},
-	{38, 14, 0, 0, false}
-};
+	return SUCCESS;
+}
 
-SceneDescription IHNM_CredisMovieDesc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNM_CreditsMovieRL,
-	ARRAYSIZE(IHNM_CreditsMovieRL)
-};
-
-// Demo
-SceneResourceData IHNMDEMO_IntroMovie1RL[] = {
-	{19, 2, 0, 0, false}	// this scene doesn't have an animation
-};
-
-SceneDescription IHNMDEMO_IntroMovie1Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNMDEMO_IntroMovie1RL,
-	ARRAYSIZE(IHNMDEMO_IntroMovie1RL)
-};
-
-SceneResourceData IHNMDEMO_IntroMovie2RL[] = {
-	{22, 2, 0, 0, false},
-	{23, 14, 0, 0, false}
-};
-
-SceneDescription IHNMDEMO_IntroMovie2Desc = {
-	0, 0, 0, 0, 0, 0, 0, 0,
-	IHNMDEMO_IntroMovie2RL,
-	ARRAYSIZE(IHNMDEMO_IntroMovie2RL)
-};
-
-LoadSceneParams IHNM_IntroList[] = {
-	{0, kLoadByDescription, &IHNM_IntroMovie1Desc, Scene::SC_IHNMIntroMovieProc1, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-	{0, kLoadByDescription, &IHNM_IntroMovie2Desc, Scene::SC_IHNMIntroMovieProc2, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-	{0, kLoadByDescription, &IHNM_IntroMovie3Desc, Scene::SC_IHNMIntroMovieProc3, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-};
-
-LoadSceneParams IHNM_CreditsList[] = {
-	{0, kLoadByDescription, &IHNM_CredisMovieDesc, Scene::SC_IHNMCreditsMovieProc, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-};
-
-LoadSceneParams IHNMDEMO_IntroList[] = {
-	{0, kLoadByDescription, &IHNMDEMO_IntroMovie1Desc, Scene::SC_IHNMIntroMovieProc1, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-	{0, kLoadByDescription, &IHNMDEMO_IntroMovie2Desc, Scene::SC_IHNMIntroMovieProc3, false, kTransitionNoFade, 0, NO_CHAPTER_CHANGE},
-};
-
-// IHNM cutaway intro resource IDs
-#define RID_IHNM_INTRO_CUTAWAYS 39
-#define RID_IHNMDEMO_INTRO_CUTAWAYS 25
-
 int Scene::IHNMCreditsProc() {
-	_vm->_anim->setCutAwayMode(kPanelVideo);
-	_vm->_interface->setMode(kPanelVideo);
+	IHNMLoadCutaways();
 
-	// Queue the credits scene
+	_vm->_music->play(0, MUSIC_NORMAL);
+
 	if (_vm->getGameId() != GID_IHNM_DEMO) {
-		_vm->_scene->queueScene(&IHNM_CreditsList[0]);
+		// Display the credits for 400 frames
+		playTitle(4, -400, true);
 	} else {
-		// TODO: demo credits
-		//_vm->_scene->queueScene(&IHNMDEMO_CreditsList[0]);
+		// Display sales info for 60 seconds
+		playTitle(3, 60, true);
 	}
 
+	_vm->_music->setVolume(0, 1000);
+	_vm->_anim->freeCutawayList();
+
 	return SUCCESS;
 }
 
-int Scene::IHNMStartProc() {
-	size_t n_introscenes;
-	size_t i;
-
-	LoadSceneParams firstScene;
-
-	/*
-	// Test code - uses loadCutawayList to load the intro cutaways, like the original
-	// TODO: with the current mechanism, we can support up to 3 intro movies here
-	// (and each movie is still hardcoded). A solution would be to remove the hardcoded
-	// bits from each movie scene proc. Another solution would be to rewrite the intro
-	// cutaway mechanism
-
-	LoadSceneParams IHNM_IntroList[10];
-	SceneDescription IHNM_IntroScene[10];
-	SceneResourceData IHNM_IntroScene_ResourceList[10][2];
-
+void Scene::IHNMLoadCutaways() {
 	ResourceContext *resourceContext;
 	//ResourceContext *soundContext;
 	byte *resourcePointer;
@@ -188,416 +129,144 @@
 
 	// Load the cutaways for the title screens
 	_vm->_anim->loadCutawayList(resourcePointer, resourceLength);
-	// Debug
-	//for (int k = 0; k < _vm->_anim->cutawayListLength(); k++) {
-	//	printf("%i %i\n", _vm->_anim->cutawayBgResourceID(k), _vm->_anim->cutawayAnimResourceID(k));
-	//}
-
-	for (int k = 0; k < _vm->_anim->cutawayListLength(); k++) {
-		// Scene resources
-		// Cutaway background resource
-		IHNM_IntroScene_ResourceList[k][0].resourceId = _vm->_anim->cutawayBgResourceID(k);
-		IHNM_IntroScene_ResourceList[k][0].resourceType = 2;
-		IHNM_IntroScene_ResourceList[k][0].buffer = 0;
-		IHNM_IntroScene_ResourceList[k][0].size = 0;
-		IHNM_IntroScene_ResourceList[k][0].invalid = false;
-		// Cutaway animation resource
-		IHNM_IntroScene_ResourceList[k][1].resourceId = _vm->_anim->cutawayAnimResourceID(k);
-		IHNM_IntroScene_ResourceList[k][1].resourceType = 14;
-		IHNM_IntroScene_ResourceList[k][1].buffer = 0;
-		IHNM_IntroScene_ResourceList[k][1].size = 0;
-		IHNM_IntroScene_ResourceList[k][1].invalid = false;
-
-		// Scene resource list
-		IHNM_IntroScene[k].resourceListResourceId = 0;
-		IHNM_IntroScene[k].endSlope = 0;
-		IHNM_IntroScene[k].beginSlope = 0;
-		IHNM_IntroScene[k].scriptModuleNumber = 0;
-		IHNM_IntroScene[k].sceneScriptEntrypointNumber = 0;
-		IHNM_IntroScene[k].startScriptEntrypointNumber = 0;
-		IHNM_IntroScene[k].musicResourceId = 0;
-		IHNM_IntroScene[k].resourceList = IHNM_IntroScene_ResourceList[k];
-		IHNM_IntroScene[k].resourceListCount = _vm->_anim->cutawayAnimResourceID(k) > 0 ? 2 : 1;
-
-		// Scene params
-		IHNM_IntroList[k].sceneDescriptor = 0;
-		IHNM_IntroList[k].loadFlag = kLoadByDescription;
-		// FIXME: when this test code is used, this bit here is not passed correctly, leading to a crash
-		IHNM_IntroList[k].sceneDescription = &IHNM_IntroScene[k];
-		// TODO: remove the hardcoded parts here and probably merge all the SC_IHNMIntroMovieProc functions in 1
-		if (k == 0) {
-			IHNM_IntroList[k].sceneProc = Scene::SC_IHNMIntroMovieProc1;
-		} else if (k == 1) {
-			IHNM_IntroList[k].sceneProc = Scene::SC_IHNMIntroMovieProc2;
-		} else {
-			IHNM_IntroList[k].sceneProc = Scene::SC_IHNMIntroMovieProc3;
-		}
-		IHNM_IntroList[k].sceneSkipTarget = false;
-		IHNM_IntroList[k].transitionType = kTransitionNoFade;
-		IHNM_IntroList[k].actorsEntrance = 0;
-		IHNM_IntroList[k].chapter = NO_CHAPTER_CHANGE; 
-	}
-	*/
-
-	// The original used the "play video" mechanism for the first part of
-	// the intro. We just use that panel mode.
-
-	_vm->_anim->setCutAwayMode(kPanelVideo);
-	_vm->_interface->setMode(kPanelVideo);
-
-	if (_vm->getGameId() != GID_IHNM_DEMO)
-		n_introscenes = ARRAYSIZE(IHNM_IntroList);
-	else
-		n_introscenes = ARRAYSIZE(IHNMDEMO_IntroList);
-
-	// Use this instead when the scenes are loaded dynamically
-	// n_introscenes = _vm->_anim->cutawayListLength();
-
-	// Queue the company and title videos
-	if (_vm->getGameId() != GID_IHNM_DEMO) {
-		for (i = 0; i < n_introscenes; i++) {
-			_vm->_scene->queueScene(&IHNM_IntroList[i]);
-		}
-	} else {
-		for (i = 0; i < n_introscenes; i++) {
-			_vm->_scene->queueScene(&IHNMDEMO_IntroList[i]);
-		}
-	}
-
-	firstScene.loadFlag = kLoadBySceneNumber;
-	firstScene.sceneDescriptor = -1;
-	firstScene.sceneDescription = NULL;
-	firstScene.sceneSkipTarget = true;
-	firstScene.sceneProc = NULL;
-	firstScene.transitionType = kTransitionFade;
-	firstScene.actorsEntrance = 0;
-	firstScene.chapter = -1;
-
-	_vm->_scene->queueScene(&firstScene);
-
-	return SUCCESS;
 }
 
-int Scene::SC_IHNMIntroMovieProc1(int param, void *refCon) {
-	return ((Scene *)refCon)->IHNMIntroMovieProc1(param);
-}
+bool Scene::checkKey() {
+	Common::Event event;
+	bool res = false;
 
-int Scene::IHNMIntroMovieProc1(int param) {
-	Event event;
-	Event *q_event;
-
-	switch (param) {
-	case SCENE_BEGIN:
-		// Background for intro scene is the first frame of the
-		// intro animation; display it and set the palette
-		event.type = kEvTOneshot;
-		event.code = kBgEvent;
-		event.op = kEventDisplay;
-		event.param = kEvPSetPalette;
-		event.time = 0;
-
-		q_event = _vm->_events->queue(&event);
-
-		if (_vm->getGameId() != GID_IHNM_DEMO) {
-			_vm->_anim->setFrameTime(0, IHNM_INTRO_FRAMETIME);
-			_vm->_anim->setFlag(0, ANIM_FLAG_ENDSCENE);
-
-			event.type = kEvTOneshot;
-			event.code = kAnimEvent;
-			event.op = kEventPlay;
-			event.param = 0;
-			event.time = 0;
-
-			q_event = _vm->_events->chain(q_event, &event);
-		} else {
-			// Start playing the intro music for the demo version
-			event.type = kEvTOneshot;
-			event.code = kMusicEvent;
-			event.param = 1;
-			event.param2 = MUSIC_NORMAL;
-			event.op = kEventPlay;
-			event.time = 0;
-
-			q_event = _vm->_events->chain(q_event, &event);
-
-			// The IHNM demo doesn't have an animation at the
-			// Cyberdreans logo screen
-
-			// Queue end of scene after a while
-			event.type = kEvTOneshot;
-			event.code = kSceneEvent;
-			event.op = kEventEnd;
-			event.time = 8000;
-
-			q_event = _vm->_events->chain(q_event, &event);
+	while (_vm->_eventMan->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			res = true;
+			break;
+		default:
+			break;
 		}
-
-		break;
-	default:
-		break;
 	}
 
-	return 0;
+	return res;
 }
 
-int Scene::SC_IHNMIntroMovieProc2(int param, void *refCon) {
-	return ((Scene *)refCon)->IHNMIntroMovieProc2(param);
-}
+bool Scene::playTitle(int title, int time, int mode) {
+	bool interrupted = false;
+	Surface *backBufferSurface;
+	int startTime = _vm->_system->getMillis();
+	int frameTime = 0;
+	int curTime;
+	int assignedId;
+	int phase = 0;
+	bool done = false;
+	bool playParameter = true;
+	static PalEntry cur_pal[PAL_ENTRIES];
+	static PalEntry pal_cut[PAL_ENTRIES];
 
-int Scene::IHNMIntroMovieProc2(int param) {
-	Event event;
-	Event *q_event;
-	PalEntry *pal;
+	backBufferSurface = _vm->_render->getBackGroundSurface();
 
-	static PalEntry current_pal[PAL_ENTRIES];
+	// Load the cutaway
 
-	switch (param) {
-	case SCENE_BEGIN:
-		// Fade to black out of the intro CyberDreams logo anim
-		_vm->_gfx->getCurrentPal(current_pal);
+	_vm->_anim->setCutAwayMode(mode);
+	_vm->_frameCount = 0;
 
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventPalToBlack;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = current_pal;
+	_vm->_gfx->getCurrentPal(cur_pal);
 
-		q_event = _vm->_events->queue(&event);
+	assignedId = _vm->_anim->playCutaway(title, true);
 
-		// Background for intro scene is the first frame of the
-		// intro animation; display it but don't set palette
-		event.type = kEvTOneshot;
-		event.code = kBgEvent;
-		event.op = kEventDisplay;
-		event.param = kEvPNoSetPalette;
-		event.time = 0;
+	_vm->_gfx->getCurrentPal(pal_cut);
 
-		q_event = _vm->_events->chain(q_event, &event);
+	while (!done) {
+		curTime = _vm->_system->getMillis();
 
-		_vm->_anim->setCycles(0, -1);
+		switch (phase) {
+		case 0: // fadeout
+		case 1: // fadeout 100%
+		case 3: // fadein
+		case 4: // fadein 100%
+		case 7: // fadeout
+		case 8: // fadeout 100%
+			if (phase == 0 || phase == 1 || phase == 7 || phase == 8)
+				_vm->_gfx->palToBlack(cur_pal, (double)(curTime - startTime) / kNormalFadeDuration);
+			else
+				_vm->_gfx->blackToPal(pal_cut, (double)(curTime - startTime) / kNormalFadeDuration);
 
-		// Unlike the original, we keep the logo spinning during the
-		// palette fades. We don't have to, but I think it looks better
-		// that way.
+			if (curTime - startTime > kNormalFadeDuration) {
+				phase++;
+				if (phase == 2 || phase == 5 || phase == 9)
+					startTime = curTime;
+				break;
+			}
+			break;
 
-		event.type = kEvTOneshot;
-		event.code = kAnimEvent;
-		event.op = kEventPlay;
-		event.param = 0;
-		event.time = 0;
+		case 2: // display background
+			_vm->_system->copyRectToScreen((byte *)backBufferSurface->pixels, backBufferSurface->w, 0, 0,
+							  backBufferSurface->w, backBufferSurface->h);
+			phase++;
+			startTime = curTime;
+			break;
 
-		q_event = _vm->_events->chain(q_event, &event);
+		case 5: // playback
+			if (time < 0) {
+				if (_vm->_frameCount >= -time) {
+					phase++;
+					break;
+				}
+			} else {
+				if (curTime - startTime >= time * 1000) {
+					phase++;
+					break;
+				}
+			}
+			
+			if (checkKey()) {
+				interrupted = true;
+				done = true;
+				break;
+			}
 
-		// Fade in from black to the scene background palette
-		_vm->_scene->getBGPal(pal);
+			if (_vm->_anim->getCycles(assignedId)) { // IHNM demo has 0 frames logo
+				if (curTime - frameTime > _vm->_anim->getFrameTime(assignedId)) {
+					_vm->_anim->play(assignedId, 0, playParameter);
 
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventBlackToPal;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = pal;
+					if (playParameter == true) // Do not loop animations
+						playParameter = false;
 
-		q_event = _vm->_events->chain(q_event, &event);
+					frameTime = curTime;
+			
+					_vm->_system->copyRectToScreen((byte *)backBufferSurface->pixels, backBufferSurface->w, 0, 0,
+							  backBufferSurface->w, backBufferSurface->h);
+				}
 
-		// Fade to black after looping animation for a while
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventPalToBlack;
-		event.time = IHNM_DGLOGO_TIME;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = pal;
+			}
+			break;
 
-		q_event = _vm->_events->chain(q_event, &event);
+		case 6: // playback end
+			startTime = curTime;
+			_vm->_gfx->getCurrentPal(cur_pal);
+			phase++;
+			break;
 
-		// Queue end of scene
-		event.type = kEvTOneshot;
-		event.code = kSceneEvent;
-		event.op = kEventEnd;
-		event.time = 0;
+		case 9: // end
+			done = true;
+			break;
+		}
 
-		q_event = _vm->_events->chain(q_event, &event);
-		break;
-	default:
-		break;
+		_vm->_system->updateScreen();
+		_vm->_system->delayMillis(10);
 	}
 
-	return 0;
-}
+	// Clean up
 
-int Scene::SC_IHNMIntroMovieProc3(int param, void *refCon) {
-	return ((Scene *)refCon)->IHNMIntroMovieProc3(param);
-}
+	_vm->_anim->endVideo();
 
-int Scene::IHNMIntroMovieProc3(int param) {
-	Event event;
-	Event *q_event;
-	PalEntry *pal;
-	static PalEntry current_pal[PAL_ENTRIES];
+	memset((byte *)backBufferSurface->pixels, 0,  backBufferSurface->w *  backBufferSurface->h);
+	_vm->_system->copyRectToScreen((byte *)backBufferSurface->pixels, backBufferSurface->w, 0, 0,
+							  backBufferSurface->w, backBufferSurface->h);
 
-	switch (param) {
-	case SCENE_BEGIN:
-		// Fade to black out of the intro DG logo anim
-		_vm->_gfx->getCurrentPal(current_pal);
-
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventPalToBlack;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = current_pal;
-
-		q_event = _vm->_events->queue(&event);
-
-		// Music, maestro
-
-		// In the GM file, this music also appears as tracks 7, 13, 19,
-		// 25 and 31, but only track 1 sounds right with the FM music.
-
-		if (_vm->getGameId() != GID_IHNM_DEMO) {
-			event.type = kEvTOneshot;
-			event.code = kMusicEvent;
-			event.param = 1;
-			event.param2 = MUSIC_NORMAL;
-			event.op = kEventPlay;
-			event.time = 0;
-
-			q_event = _vm->_events->chain(q_event, &event);
-		}
-
-		// Background for intro scene is the first frame of the intro
-		// animation; display it but don't set palette
-		event.type = kEvTOneshot;
-		event.code = kBgEvent;
-		event.op = kEventDisplay;
-		event.param = kEvPNoSetPalette;
-		event.time = 0;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		// Fade in from black to the scene background palette
-		_vm->_scene->getBGPal(pal);
-
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventBlackToPal;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = pal;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		event.type = kEvTOneshot;
-		event.code = kAnimEvent;
-		event.op = kEventPlay;
-		event.param = 0;
-		event.time = 0;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		// Queue end of scene after a while
-		// The delay has been increased so the speech won't start until the music has ended
-		event.type = kEvTOneshot;
-		event.code = kSceneEvent;
-		event.op = kEventEnd;
-		if (_vm->getGameId() != GID_IHNM_DEMO)
-			event.time = _vm->_music->hasAdlib() ? IHNM_TITLE_TIME_FM : IHNM_TITLE_TIME_GM;
-		else
-			event.time = 12000;
-
-		q_event = _vm->_events->chain(q_event, &event);
-		break;
-	default:
-		break;
-	}
-
-	return 0;
+	return interrupted;
 }
 
-int Scene::SC_IHNMCreditsMovieProc(int param, void *refCon) {
-	return ((Scene *)refCon)->IHNMCreditsMovieProc(param);
+bool Scene::playLoopingTitle(int title, int seconds) {
+	return playTitle(title, seconds, kPanelCutaway);
 }
 
-int Scene::IHNMCreditsMovieProc(int param) {
-	Event event;
-	Event *q_event;
-	PalEntry *pal;
-	static PalEntry current_pal[PAL_ENTRIES];
-
-	switch (param) {
-	case SCENE_BEGIN:
-		// Fade to black out of the end movie anim
-		_vm->_gfx->getCurrentPal(current_pal);
-
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventPalToBlack;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = current_pal;
-
-		q_event = _vm->_events->queue(&event);
-
-		event.type = kEvTOneshot;
-		event.code = kMusicEvent;
-		event.param = 0;
-		event.param2 = MUSIC_NORMAL;
-		event.op = kEventPlay;
-		event.time = 0;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		// Background for credits scene is the first frame of the credits
-		// animation; display it but don't set palette
-		event.type = kEvTOneshot;
-		event.code = kBgEvent;
-		event.op = kEventDisplay;
-		event.param = kEvPNoSetPalette;
-		event.time = 0;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		// Fade in from black to the scene background palette
-		_vm->_scene->getBGPal(pal);
-
-		event.type = kEvTContinuous;
-		event.code = kPalEvent;
-		event.op = kEventBlackToPal;
-		event.time = 0;
-		event.duration = IHNM_PALFADE_TIME;
-		event.data = pal;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		event.type = kEvTOneshot;
-		event.code = kAnimEvent;
-		event.op = kEventPlay;
-		event.param = 0;
-		event.time = 0;
-
-		q_event = _vm->_events->chain(q_event, &event);
-
-		// Queue end of scene after a while
-		event.type = kEvTOneshot;
-		event.code = kSceneEvent;
-		event.op = kEventEnd;
-		// TODO
-		if (_vm->getGameId() != GID_IHNM_DEMO)
-			event.time = 12000;
-		else
-			event.time = 12000;
-
-		q_event = _vm->_events->chain(q_event, &event);
-		break;
-	case SCENE_END:
-		_vm->shutDown();
-		break;
-	default:
-		break;
-	}
-
-	return 0;
-}
-
 } // End of namespace Saga

Modified: scummvm/trunk/engines/saga/scene.h
===================================================================
--- scummvm/trunk/engines/saga/scene.h	2007-08-29 16:05:06 UTC (rev 28762)
+++ scummvm/trunk/engines/saga/scene.h	2007-08-30 17:55:19 UTC (rev 28763)
@@ -399,6 +399,12 @@
 	int IHNMCreditsProc();
 	int ITEStartProc();
 
+	void IHNMLoadCutaways();
+	bool checkKey();
+
+	bool playTitle(int title, int time, int mode = kPanelVideo);
+	bool playLoopingTitle(int title, int seconds);
+
  public:
 	static int SC_IHNMIntroMovieProc1(int param, void *refCon);
 	static int SC_IHNMIntroMovieProc2(int param, void *refCon);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list