[Scummvm-cvs-logs] scummvm master -> 6a95d0e8c99fa1b586ffddf1e4dd3dd12491487b

fuzzie fuzzie at fuzzie.org
Fri Nov 4 22:41:08 CET 2011


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
1c1eed784a COMPOSER: Add support for V1 pipes.
4da2f24866 COMPOSER: Handle V1 pipes properly.
6a95d0e8c9 COMPOSER: Fix kOldOpPlayWav.


Commit: 1c1eed784a0eb029b5db75aecf4cfed1c4e80e83
    https://github.com/scummvm/scummvm/commit/1c1eed784a0eb029b5db75aecf4cfed1c4e80e83
Author: Alyssa Milburn (fuzzie at fuzzie.org)
Date: 2011-11-04T14:38:33-07:00

Commit Message:
COMPOSER: Add support for V1 pipes.

Changed paths:
    engines/composer/graphics.cpp
    engines/composer/resource.cpp
    engines/composer/resource.h



diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp
index ced7073..6f9aa76 100644
--- a/engines/composer/graphics.cpp
+++ b/engines/composer/graphics.cpp
@@ -125,6 +125,7 @@ void ComposerEngine::playAnimation(uint16 animId, int16 x, int16 y, int16 eventP
 		if (type != 1) {
 			newPipe = new Pipe(stream);
 			_pipes.push_front(newPipe);
+			newPipe->nextFrame();
 			stream = newPipe->getResource(ID_ANIM, animId, false);
 		}
 	}
diff --git a/engines/composer/resource.cpp b/engines/composer/resource.cpp
index b40bdb3..ce2661f 100644
--- a/engines/composer/resource.cpp
+++ b/engines/composer/resource.cpp
@@ -252,8 +252,10 @@ Pipe::Pipe(Common::SeekableReadStream *stream) {
 	_offset = 0;
 	_stream = stream;
 	_anim = NULL;
+}
 
-	nextFrame();
+Pipe::~Pipe() {
+	delete _stream;
 }
 
 void Pipe::nextFrame() {
@@ -334,4 +336,61 @@ Common::SeekableReadStream *Pipe::getResource(uint32 tag, uint16 id, bool buffer
 	return new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES);
 }
 
+OldPipe::OldPipe(Common::SeekableReadStream *stream) : Pipe(stream), _currFrame(0) {
+	uint32 tag = _stream->readUint32BE();
+	if (tag != ID_PIPE)
+		error("invalid tag for pipe (%08x)", tag);
+
+	_numFrames = _stream->readUint32LE();
+	uint16 scriptCount = _stream->readUint16LE();
+	_scripts.reserve(scriptCount);
+	for (uint i = 0; i < scriptCount; i++)
+		_scripts.push_back(_stream->readUint16LE());
+
+	_offset = _stream->pos();
+}
+
+void OldPipe::nextFrame() {
+	if (_currFrame >= _numFrames)
+		return;
+
+	_stream->seek(_offset, SEEK_SET);
+
+	uint32 tag = _stream->readUint32BE();
+	if (tag != ID_FRME)
+		error("invalid tag for pipe (%08x)", tag);
+
+	uint16 spriteCount = _stream->readUint16LE();
+	uint32 spriteSize = _stream->readUint32LE();
+	uint32 audioSize = _stream->readUint32LE();
+
+	Common::Array<uint16> spriteIds;
+	Common::Array<PipeResourceEntry> spriteEntries;
+	for (uint i = 0; i < spriteCount; i++) {
+		spriteIds.push_back(_stream->readUint16LE());
+		PipeResourceEntry entry;
+		entry.size = _stream->readUint32LE();
+		entry.offset = _stream->readUint32LE();
+		spriteEntries.push_back(entry);
+	}
+
+	uint32 spriteDataOffset = _stream->pos();
+	_stream->skip(spriteSize);
+
+	ResourceMap &spriteResMap = _types[ID_BMAP];
+	spriteResMap.clear();
+	for (uint i = 0; i < spriteIds.size(); i++) {
+		PipeResourceEntry &entry = spriteEntries[i];
+		entry.offset += spriteDataOffset;
+		spriteResMap[spriteIds[i]].entries.push_back(entry);
+	}
+
+	// FIXME
+	uint32 audioDataOffset = _stream->pos();
+	_stream->skip(audioSize);
+
+	_offset = _stream->pos();
+	_currFrame++;
+}
+
 }	// End of namespace Composer
diff --git a/engines/composer/resource.h b/engines/composer/resource.h
index 9408cdf..e2ce235 100644
--- a/engines/composer/resource.h
+++ b/engines/composer/resource.h
@@ -45,6 +45,8 @@ struct Animation;
 #define ID_VARI MKTAG('V','A','R','I') // Variables
 #define ID_WAVE MKTAG('W','A','V','E') // Wave
 
+#define ID_FRME MKTAG('F','R','M','E') // Frame
+
 class Archive {
 public:
 	Archive();
@@ -102,13 +104,16 @@ struct PipeResource {
 class Pipe {
 public:
 	Pipe(Common::SeekableReadStream *stream);
-	void nextFrame();
+	virtual ~Pipe();
+	virtual void nextFrame();
 
 	Animation *_anim;
 
 	bool hasResource(uint32 tag, uint16 id) const;
 	Common::SeekableReadStream *getResource(uint32 tag, uint16 id, bool buffering);
 
+	virtual const Common::Array<uint16> *getScripts() { return NULL; }
+
 protected:
 	Common::SeekableReadStream *_stream;
 
@@ -119,6 +124,18 @@ protected:
 	uint32 _offset;
 };
 
+class OldPipe : public Pipe {
+public:
+	OldPipe(Common::SeekableReadStream *stream);
+	void nextFrame();
+
+	const Common::Array<uint16> *getScripts() { return &_scripts; }
+
+protected:
+	uint32 _currFrame, _numFrames;
+	Common::Array<uint16> _scripts;
+};
+
 } // End of namespace Composer
 
 #endif


Commit: 4da2f24866fc1094f46cf9ec5eeba4d939822824
    https://github.com/scummvm/scummvm/commit/4da2f24866fc1094f46cf9ec5eeba4d939822824
Author: Alyssa Milburn (fuzzie at fuzzie.org)
Date: 2011-11-04T14:39:27-07:00

Commit Message:
COMPOSER: Handle V1 pipes properly.

Changed paths:
    engines/composer/composer.cpp
    engines/composer/composer.h
    engines/composer/graphics.cpp
    engines/composer/scripting.cpp



diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
index 1fa21a5..5c66d9f 100644
--- a/engines/composer/composer.cpp
+++ b/engines/composer/composer.cpp
@@ -53,8 +53,11 @@ ComposerEngine::ComposerEngine(OSystem *syst, const ComposerGameDescription *gam
 ComposerEngine::~ComposerEngine() {
 	DebugMan.clearAllDebugChannels();
 
+	stopPipes();
 	for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.end(); i++)
 		delete *i;
+	for (Common::List<Animation *>::iterator i = _anims.begin(); i != _anims.end(); i++)
+		delete *i;
 	for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++)
 		delete i->_archive;
 	for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++)
@@ -421,10 +424,7 @@ void ComposerEngine::unloadLibrary(uint id) {
 			delete *j;
 		}
 		_anims.clear();
-		for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
-			delete *j;
-		}
-		_pipes.clear();
+		stopPipes();
 
 		for (Common::List<Sprite>::iterator j = _sprites.begin(); j != _sprites.end(); j++) {
 			j->_surface.free();
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index ff85ed5..0d11817 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -204,6 +204,7 @@ private:
 	void runScript(uint16 id);
 	int16 scriptFuncCall(uint16 id, int16 param1, int16 param2, int16 param3);
 	void runOldScript(uint16 id, uint16 wait);
+	void stopOldScript(uint16 id);
 	void tickOldScripts();
 	bool tickOldScript(OldScript *script);
 
@@ -212,6 +213,9 @@ private:
 	void playWaveForAnim(uint16 id, uint16 priority, bool bufferingOnly);
 	void processAnimFrame();
 
+	void playPipe(uint16 id);
+	void stopPipes();
+
 	bool spriteVisible(uint16 id, uint16 animId);
 	Sprite *addSprite(uint16 id, uint16 animId, uint16 zorder, const Common::Point &pos);
 	void removeSprite(uint16 id, uint16 animId);
diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp
index 6f9aa76..dc0c99a 100644
--- a/engines/composer/graphics.cpp
+++ b/engines/composer/graphics.cpp
@@ -355,6 +355,38 @@ void ComposerEngine::processAnimFrame() {
 	}
 }
 
+void ComposerEngine::playPipe(uint16 id) {
+	stopPipes();
+
+	if (!hasResource(ID_PIPE, id)) {
+		error("couldn't find pipe %d", id);
+	}
+
+	Common::SeekableReadStream *stream = getResource(ID_PIPE, id);
+	OldPipe *pipe = new OldPipe(stream);
+	_pipes.push_front(pipe);
+	//pipe->nextFrame();
+
+	const Common::Array<uint16> *scripts = pipe->getScripts();
+	if (scripts && !scripts->empty())
+		runScript((*scripts)[0], 1, 0, 0);
+}
+
+void ComposerEngine::stopPipes() {
+	for (Common::List<Pipe *>::iterator j = _pipes.begin(); j != _pipes.end(); j++) {
+		const Common::Array<uint16> *scripts = (*j)->getScripts();
+		if (scripts) {
+			for (uint i = 0; i < scripts->size(); i++) {
+				removeSprite((*scripts)[i], 0);
+				stopOldScript((*scripts)[i]);
+			}
+		}
+		delete *j;
+	}
+
+	_pipes.clear();
+}
+
 bool ComposerEngine::spriteVisible(uint16 id, uint16 animId) {
 	for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
 		if (i->_id != id)
@@ -376,7 +408,10 @@ Sprite *ComposerEngine::addSprite(uint16 id, uint16 animId, uint16 zorder, const
 	for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
 		if (i->_id != id)
 			continue;
-		if (i->_animId && animId && (i->_animId != animId))
+		if (getGameType() == GType_ComposerV1) {
+			if (i->_animId != animId)
+				continue;
+		} else if (i->_animId && animId && (i->_animId != animId))
 			continue;
 
 		dirtySprite(*i);
@@ -426,7 +461,10 @@ void ComposerEngine::removeSprite(uint16 id, uint16 animId) {
 	for (Common::List<Sprite>::iterator i = _sprites.begin(); i != _sprites.end(); i++) {
 		if (!i->_id || (id && i->_id != id))
 			continue;
-		if (i->_animId && animId && (i->_animId != animId))
+		if (getGameType() == GType_ComposerV1) {
+			if (i->_animId != animId)
+				continue;
+		} else if (i->_animId && animId && (i->_animId != animId))
 			continue;
 		dirtySprite(*i);
 		i->_surface.free();
diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
index bf02924..e9e8b75 100644
--- a/engines/composer/scripting.cpp
+++ b/engines/composer/scripting.cpp
@@ -733,7 +733,7 @@ OldScript::~OldScript() {
 }
 
 void ComposerEngine::runOldScript(uint16 id, uint16 wait) {
-	// FIXME: kill any old script
+	stopOldScript(id);
 
 	Common::SeekableReadStream *stream = getResource(ID_SCRP, id);
 	OldScript *script = new OldScript(id, stream);
@@ -741,6 +741,17 @@ void ComposerEngine::runOldScript(uint16 id, uint16 wait) {
 	_oldScripts.push_back(script);
 }
 
+void ComposerEngine::stopOldScript(uint16 id) {
+	// FIXME: this could potentially (in the case of buggy script) be called on an in-use script
+
+	for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.end(); i++) {
+		if ((*i)->_id == id) {
+			delete *i;
+			i = _oldScripts.reverse_erase(i);
+		}
+	}
+}
+
 void ComposerEngine::tickOldScripts() {
 	for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.end(); i++) {
 		if (!tickOldScript(*i)) {
@@ -780,7 +791,8 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 	}
 
 	bool running = true;
-	while (running && script->_stream->pos() + 1 < (int)script->_size) {
+	bool erasedOldSprite = false;
+	while (running && script->_stream->pos() < (int)script->_size) {
 		uint16 spriteId, scriptId, buttonId, pipeId;
 		Common::Point spritePos;
 
@@ -792,7 +804,10 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 			running = false;
 			break;
 		case kOldOpReplaceSprite:
-			removeSprite(0, script->_id);
+			if (!erasedOldSprite) {
+				removeSprite(0, script->_id);
+				erasedOldSprite = true;
+			}
 
 			spriteId = script->_stream->readUint16LE();
 			spritePos.x = script->_stream->readSint16LE();
@@ -820,7 +835,8 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 		case kOldOpStopScript:
 			scriptId = script->_stream->readUint16LE();
 			debug(3, "kOldOpStopScript(%d)", scriptId);
-			warning("kOldOpStopScript not yet implemented"); // FIXME
+			removeSprite(0, scriptId);
+			stopOldScript(scriptId);
 			break;
 		case kOldOpActivateButton:
 			buttonId = script->_stream->readUint16LE();
@@ -882,12 +898,13 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 		case kOldOpPlayPipe:
 			pipeId = script->_stream->readUint16LE();
 			debug(3, "kOldOpPlayPipe(%d)", pipeId);
-			warning("V1 pipes not yet implemented"); // FIXME
+			playPipe(pipeId);
 			break;
 		case kOldOpStopPipe:
 			pipeId = script->_stream->readUint16LE();
 			debug(3, "kOldOpStopPipe(%d)", pipeId);
-			warning("V1 pipes not yet implemented"); // FIXME
+			// yes, pipeId is ignored here..
+			stopPipes();
 			break;
 		case kOldOpNewScreen:
 			uint16 newScreenId;


Commit: 6a95d0e8c99fa1b586ffddf1e4dd3dd12491487b
    https://github.com/scummvm/scummvm/commit/6a95d0e8c99fa1b586ffddf1e4dd3dd12491487b
Author: Alyssa Milburn (fuzzie at fuzzie.org)
Date: 2011-11-04T14:39:44-07:00

Commit Message:
COMPOSER: Fix kOldOpPlayWav.

Changed paths:
    engines/composer/scripting.cpp



diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
index e9e8b75..a4c78c3 100644
--- a/engines/composer/scripting.cpp
+++ b/engines/composer/scripting.cpp
@@ -816,10 +816,11 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 			addSprite(spriteId, script->_id, script->_zorder, spritePos);
 			break;
 		case kOldOpPlayWav:
-			uint16 wavId;
+			uint16 wavId, prio;
 			wavId = script->_stream->readUint16LE();
-			debug(3, "kOldOpPlayWav(%d)", wavId);
-			playWaveForAnim(wavId, 0, false);
+			prio = script->_stream->readUint16LE();
+			debug(3, "kOldOpPlayWav(%d, %d)", wavId, prio);
+			playWaveForAnim(wavId, prio, false);
 			break;
 		case kOldOpRunScript:
 			scriptId = script->_stream->readUint16LE();






More information about the Scummvm-git-logs mailing list