[Scummvm-cvs-logs] SF.net SVN: scummvm: [29547] scummvm/trunk/engines/lure

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Sun Nov 18 06:10:56 CET 2007


Revision: 29547
          http://scummvm.svn.sourceforge.net/scummvm/?rev=29547&view=rev
Author:   dreammaster
Date:     2007-11-17 21:10:56 -0800 (Sat, 17 Nov 2007)

Log Message:
-----------
Cleaned up animation player and added support for a set of sounds to be played during an animation

Modified Paths:
--------------
    scummvm/trunk/engines/lure/animseq.cpp
    scummvm/trunk/engines/lure/animseq.h
    scummvm/trunk/engines/lure/game.cpp
    scummvm/trunk/engines/lure/intro.cpp

Modified: scummvm/trunk/engines/lure/animseq.cpp
===================================================================
--- scummvm/trunk/engines/lure/animseq.cpp	2007-11-18 04:54:52 UTC (rev 29546)
+++ scummvm/trunk/engines/lure/animseq.cpp	2007-11-18 05:10:56 UTC (rev 29547)
@@ -24,9 +24,10 @@
  */
 
 #include "lure/animseq.h"
-#include "lure/palette.h"
 #include "lure/decode.h"
 #include "lure/events.h"
+#include "lure/palette.h"
+#include "lure/sound.h"
 #include "common/endian.h"
 
 namespace Lure {
@@ -36,10 +37,10 @@
 // Escape has been pressed, and the introduction should be aborted.
 
 AnimAbortType AnimationSequence::delay(uint32 milliseconds) {
-	uint32 delayCtr = _system.getMillis() + milliseconds;
 	Events &events = Events::getReference();
+	uint32 delayCtr = g_system->getMillis() + milliseconds;
 
-	while (_system.getMillis() < delayCtr) {
+	while (g_system->getMillis() < delayCtr) {
 		while (events.pollEvent()) {
 			if (events.type() == Common::EVENT_KEYDOWN) {
 				if (events.event().kbd.keycode == Common::KEYCODE_ESCAPE) return ABORT_END_INTRO;
@@ -50,9 +51,9 @@
 				return ABORT_END_INTRO;
 		}
 
-		uint32 delayAmount = delayCtr - _system.getMillis();
+		uint32 delayAmount = delayCtr - g_system->getMillis();
 		if (delayAmount > 10) delayAmount = 10;
-		_system.delayMillis(delayAmount);
+		g_system->delayMillis(delayAmount);
 	}
 	return ABORT_NONE;
 }
@@ -61,7 +62,8 @@
 // Decodes a single frame of the animation sequence
 
 void AnimationSequence::decodeFrame(byte *&pPixels, byte *&pLines) {
-	byte *screen = _screen.screen_raw();   
+	Screen &screen = Screen::getReference();
+	byte *screenData = screen.screen_raw();   
 	uint16 screenPos = 0;
 	uint16 len;
 
@@ -74,8 +76,8 @@
 		}
 	
 		// Move the splice over
-		memcpy(screen, pPixels, len);
-		screen += len;
+		memcpy(screenData, pPixels, len);
+		screenData += len;
 		screenPos += len;
 		pPixels += len;
 
@@ -86,16 +88,18 @@
 			pLines += 2;
 		}
 
-		screen += len;
+		screenData += len;
 		screenPos += len;
 	}
 
 	// Make the decoded frame visible
-	_screen.update();
+	screen.update();
 }
 
-AnimationSequence::AnimationSequence(Screen &screen, OSystem &system, uint16 screenId, Palette &palette, 
-					 bool fadeIn): _screen(screen), _system(system), _screenId(screenId), _palette(palette) {
+AnimationSequence::AnimationSequence(uint16 screenId, Palette &palette,  bool fadeIn, int frameDelay, 
+					 const AnimSoundSequence *soundList): _screenId(screenId), _palette(palette), 
+					 _frameDelay(frameDelay), _soundList(soundList) {
+	Screen &screen = Screen::getReference();
 	PictureDecoder decoder;
 	Disk &d = Disk::getReference();
 	MemoryBlock *data = d.getEntry(_screenId);
@@ -105,13 +109,13 @@
 	_lineRefs = d.getEntry(_screenId + 1);
 
 	// Reset the palette and set the initial starting screen
-	_screen.setPaletteEmpty(RES_PALETTE_ENTRIES);
-	_screen.screen().data().copyFrom(_decodedData, 0, 0, FULL_SCREEN_HEIGHT * FULL_SCREEN_WIDTH);
-	_screen.update();
+	screen.setPaletteEmpty(RES_PALETTE_ENTRIES);
+	screen.screen().data().copyFrom(_decodedData, 0, 0, FULL_SCREEN_HEIGHT * FULL_SCREEN_WIDTH);
+	screen.update();
 
 	// Set the palette
-	if (fadeIn)	_screen.paletteFadeIn(&_palette);
-	else _screen.setPalette(&_palette, 0, _palette.numEntries());
+	if (fadeIn)	screen.paletteFadeIn(&_palette);
+	else screen.setPalette(&_palette, 0, _palette.numEntries());
 
 	// Set up frame poitners
 	_pPixels = _decodedData->data() + SCREEN_SIZE;
@@ -130,22 +134,34 @@
 
 AnimAbortType AnimationSequence::show() {
 	AnimAbortType result;
+	const AnimSoundSequence *soundFrame = _soundList;
+	int frameCtr = 0;
 
 	// Loop through displaying the animations
 	while ((_pPixels < _pPixelsEnd) && (_pLines < _pLinesEnd)) {
+		if ((soundFrame != NULL) && (frameCtr == 0))
+			Sound.musicInterface_Play(soundFrame->soundId, soundFrame->channelNum);
+
 		decodeFrame(_pPixels, _pLines);
 
-		result = delay(7 * 1000 / 50);
+		result = delay(_frameDelay * 1000 / 50);
 		if (result != ABORT_NONE) return result;
+
+		if ((soundFrame != NULL) && (++frameCtr == soundFrame->numFrames)) {
+			frameCtr = 0;
+			++soundFrame;
+			if (soundFrame->numFrames == 0) soundFrame = NULL;
+		}
 	}
 
 	return ABORT_NONE;
 }
 
 bool AnimationSequence::step() {
+	Screen &screen = Screen::getReference();
 	if ((_pPixels >= _pPixelsEnd) || (_pLines >= _pLinesEnd)) return false;
 	decodeFrame(_pPixels, _pLines);
-	_screen.setPalette(&_palette);
+	screen.setPalette(&_palette);
 	return true;
 }
 

Modified: scummvm/trunk/engines/lure/animseq.h
===================================================================
--- scummvm/trunk/engines/lure/animseq.h	2007-11-18 04:54:52 UTC (rev 29546)
+++ scummvm/trunk/engines/lure/animseq.h	2007-11-18 05:10:56 UTC (rev 29547)
@@ -32,22 +32,28 @@
 
 enum AnimAbortType {ABORT_NONE, ABORT_END_INTRO, ABORT_NEXT_SCENE};
 
+struct AnimSoundSequence {
+	uint16 numFrames;
+	uint8 soundId;
+	uint8 channelNum;
+};
+
 class AnimationSequence {
 private:
-	Screen &_screen;
-	OSystem &_system;
 	uint16 _screenId;
 	Palette &_palette;
 	MemoryBlock *_decodedData;
 	MemoryBlock *_lineRefs;
 	byte *_pPixels, *_pLines;
 	byte *_pPixelsEnd, *_pLinesEnd;
+	const AnimSoundSequence *_soundList;
+	int _frameDelay;
 
 	AnimAbortType delay(uint32 milliseconds);
 	void decodeFrame(byte *&pPixels, byte *&pLines);
 public:
-	AnimationSequence(Screen &screen, OSystem &system, uint16 screenId, Palette &palette, 
-		bool fadeIn);
+	AnimationSequence(uint16 screenId, Palette &palette,  bool fadeIn, int frameDelay = 7, 
+		const AnimSoundSequence *soundList = NULL);
 	~AnimationSequence();
 
 	AnimAbortType show();

Modified: scummvm/trunk/engines/lure/game.cpp
===================================================================
--- scummvm/trunk/engines/lure/game.cpp	2007-11-18 04:54:52 UTC (rev 29546)
+++ scummvm/trunk/engines/lure/game.cpp	2007-11-18 05:10:56 UTC (rev 29547)
@@ -267,8 +267,7 @@
 		// If Skorl catches player, show the catching animation
 		if ((_state & GS_CAUGHT) != 0) {
 			Palette palette(SKORL_CATCH_PALETTE_ID);
-			AnimationSequence *anim = new AnimationSequence(screen, system, 
-				SKORL_CATCH_ANIM_ID, palette, false);
+			AnimationSequence *anim = new AnimationSequence(SKORL_CATCH_ANIM_ID, palette, false);
 			mouse.cursorOff();
 			Sound.addSound(0x33);
 			anim->show();
@@ -371,9 +370,7 @@
 }
 
 void Game::displayChuteAnimation() {
-	OSystem &system = *g_system;
 	Resources &res = Resources::getReference();
-	Screen &screen = Screen::getReference();
 	Mouse &mouse = Mouse::getReference();
 
 	ValueTableData &fields = res.fieldList();
@@ -385,18 +382,15 @@
 	Sound.killSounds();
 	Sound.musicInterface_Play(0x40, 0);
 
-	AnimationSequence *anim = new AnimationSequence(screen, system, 
-		CHUTE_ANIM_ID, palette, false);
+	AnimationSequence *anim = new AnimationSequence(CHUTE_ANIM_ID, palette, false);
 	anim->show();
 	delete anim;
 	
-	anim = new AnimationSequence(screen, system, CHUTE2_ANIM_ID, 
-		palette, false);	
+	anim = new AnimationSequence(CHUTE2_ANIM_ID, palette, false);	
 	anim->show();
 	delete anim;
 
-	anim = new AnimationSequence(screen, system, CHUTE3_ANIM_ID, 
-		palette, false);	
+	anim = new AnimationSequence(CHUTE3_ANIM_ID, palette, false);	
 	anim->show();
 	delete anim;
 
@@ -406,14 +400,11 @@
 }
 
 void Game::displayBarrelAnimation() {
-	OSystem &system = *g_system;
-	Screen &screen = Screen::getReference();
 	Mouse &mouse = Mouse::getReference();
 
 	debugC(ERROR_INTERMEDIATE, kLureDebugAnimations, "Starting barrel animation");
 	Palette palette(BARREL_PALETTE_ID);
-	AnimationSequence *anim = new AnimationSequence(screen, system, 
-		BARREL_ANIM_ID, palette, false);
+	AnimationSequence *anim = new AnimationSequence(BARREL_ANIM_ID, palette, false);
 	mouse.cursorOff();
 
 	Sound.killSounds();

Modified: scummvm/trunk/engines/lure/intro.cpp
===================================================================
--- scummvm/trunk/engines/lure/intro.cpp	2007-11-18 04:54:52 UTC (rev 29546)
+++ scummvm/trunk/engines/lure/intro.cpp	2007-11-18 05:10:56 UTC (rev 29547)
@@ -117,7 +117,7 @@
 		}
 
 		bool fadeIn = curr_anim == anim_screens;
-		anim = new AnimationSequence(_screen, _system, curr_anim->resourceId, 
+		anim = new AnimationSequence(curr_anim->resourceId, 
 			coll.getPalette(curr_anim->paletteIndex), fadeIn);
 		if (curr_anim->initialPause != 0)  
 			if (interruptableDelay(curr_anim->initialPause * 1000 / 50)) return true;
@@ -148,7 +148,7 @@
 	// Show battle pictures one frame at a time
 
 	result = false;
-	anim = new AnimationSequence(_screen, _system, 0x48, coll.getPalette(4), false);
+	anim = new AnimationSequence(0x48, coll.getPalette(4), false);
 	do {
 		result = interruptableDelay(2000);
 		_screen.paletteFadeOut();


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