[Scummvm-cvs-logs] scummvm master -> d6bfbdd60eb89ac56991efb851cbde4225a56c5c

fuzzie fuzzie at fuzzie.org
Sat Nov 5 16:01:37 CET 2011


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

Summary:
81785c6090 COMPOSER: Fix non-pipe audio buffers.
d6bfbdd60e COMPOSER: Implement V1 random events.


Commit: 81785c60909b4a051afdd2f8050dbfc23d071b17
    https://github.com/scummvm/scummvm/commit/81785c60909b4a051afdd2f8050dbfc23d071b17
Author: Alyssa Milburn (fuzzie at fuzzie.org)
Date: 2011-11-05T07:59:40-07:00

Commit Message:
COMPOSER: Fix non-pipe audio buffers.

Changed paths:
    engines/composer/graphics.cpp



diff --git a/engines/composer/graphics.cpp b/engines/composer/graphics.cpp
index bd3cc3a..42d0a20 100644
--- a/engines/composer/graphics.cpp
+++ b/engines/composer/graphics.cpp
@@ -188,8 +188,10 @@ void ComposerEngine::playWaveForAnim(uint16 id, uint16 priority, bool bufferingO
 		}
 	}
 	Common::SeekableReadStream *stream = NULL;
+	bool fromPipe = true;
 	if (!bufferingOnly && hasResource(ID_WAVE, id)) {
 		stream = getResource(ID_WAVE, id);
+		fromPipe = false;
 	} else {
 		for (Common::List<Pipe *>::iterator k = _pipes.begin(); k != _pipes.end(); k++) {
 			Pipe *pipe = *k;
@@ -201,12 +203,18 @@ void ComposerEngine::playWaveForAnim(uint16 id, uint16 priority, bool bufferingO
 	}
 	if (!stream)
 		return;
-	// FIXME: non-pipe buffers have fixed wav header (data at +44, size at +40)
-	byte *buffer = (byte *)malloc(stream->size());
-	stream->read(buffer, stream->size());
+
+	uint32 size = stream->size();
+	if (!fromPipe) {
+		// non-pipe buffers have fixed wav header (data at +44, size at +40)
+		stream->skip(40);
+		size = stream->readUint32LE();
+	}
+	byte *buffer = (byte *)malloc(size);
+	stream->read(buffer, size);
 	if (!_audioStream)
 		_audioStream = Audio::makeQueuingAudioStream(22050, false);
-	_audioStream->queueBuffer(buffer, stream->size(), DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
+	_audioStream->queueBuffer(buffer, size, DisposeAfterUse::YES, Audio::FLAG_UNSIGNED);
 	_currSoundPriority = priority;
 	delete stream;
 	if (!_mixer->isSoundHandleActive(_soundHandle))


Commit: d6bfbdd60eb89ac56991efb851cbde4225a56c5c
    https://github.com/scummvm/scummvm/commit/d6bfbdd60eb89ac56991efb851cbde4225a56c5c
Author: Alyssa Milburn (fuzzie at fuzzie.org)
Date: 2011-11-05T08:00:02-07:00

Commit Message:
COMPOSER: Implement V1 random events.

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



diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
index 17c14dd..556dad7 100644
--- a/engines/composer/composer.cpp
+++ b/engines/composer/composer.cpp
@@ -443,6 +443,20 @@ void ComposerEngine::loadLibrary(uint id) {
 		newLib._keyboardHandlers.push_back(handler);
 	}
 
+	Common::Array<uint16> randResources = library._archive->getResourceIDList(ID_RAND);
+	for (uint i = 0; i < randResources.size(); i++) {
+		Common::SeekableReadStream *stream = library._archive->getResource(ID_RAND, randResources[i]);
+		Common::Array<RandomEvent> &events = _randomEvents[randResources[i]];
+		uint16 count = stream->readUint16LE();
+		for (uint j = 0; j < count; j++) {
+			RandomEvent random;
+			random.scriptId = stream->readUint16LE();
+			random.weight = stream->readUint16LE();
+			events.push_back(random);
+		}
+		delete stream;
+	}
+
 	// add background sprite, if it exists
 	if (hasResource(ID_BMAP, 1000))
 		setBackground(1000);
@@ -470,6 +484,8 @@ void ComposerEngine::unloadLibrary(uint id) {
 		_anims.clear();
 		stopPipes();
 
+		_randomEvents.clear();
+
 		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 02dbca5..cebe977 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -101,6 +101,11 @@ struct KeyboardHandler {
 	uint16 scriptId;
 };
 
+struct RandomEvent {
+	uint16 weight;
+	uint16 scriptId;
+};
+
 struct Library {
 	uint _id;
 	Archive *_archive;
@@ -182,6 +187,8 @@ private:
 	Common::List<Animation *> _anims;
 	Common::List<Pipe *> _pipes;
 
+	Common::HashMap<uint16, Common::Array<RandomEvent> > _randomEvents;
+
 	void onMouseDown(const Common::Point &pos);
 	void onMouseMove(const Common::Point &pos);
 	void onKeyDown(uint16 keyCode);
diff --git a/engines/composer/resource.h b/engines/composer/resource.h
index cc1985e..e0052cd 100644
--- a/engines/composer/resource.h
+++ b/engines/composer/resource.h
@@ -43,6 +43,7 @@ struct Animation;
 #define ID_CTBL MKTAG('C','T','B','L') // Color Table
 #define ID_EVNT MKTAG('E','V','N','T') // Event
 #define ID_PIPE MKTAG('P','I','P','E') // Pipe
+#define ID_RAND MKTAG('R','A','N','D') // Random Object
 #define ID_SCRP MKTAG('S','C','R','P') // Script
 #define ID_VARI MKTAG('V','A','R','I') // Variables
 #define ID_WAVE MKTAG('W','A','V','E') // Wave
diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
index a4c78c3..3a201c8 100644
--- a/engines/composer/scripting.cpp
+++ b/engines/composer/scripting.cpp
@@ -922,7 +922,21 @@ bool ComposerEngine::tickOldScript(OldScript *script) {
 			uint16 randomId;
 			randomId = script->_stream->readUint16LE();
 			debug(3, "kOldOpRunRandom(%d)", randomId);
-			warning("V1 random not yet implemented"); // FIXME
+			if (!_randomEvents.contains(randomId)) {
+				warning("kOldOpRunRandom found no entries for id %d", randomId);
+			} else {
+				uint32 randValue = _rnd->getRandomNumberRng(0, 32767);
+				const Common::Array<RandomEvent> &events = _randomEvents[randomId];
+				uint i = 0;
+				for (i = 0; i < events.size(); i++) {
+					if ((i + 1 == events.size()) || (randValue <= events[i].weight)) {
+						runScript(events[i].scriptId);
+						break;
+					} else {
+						randValue -= events[i].weight;
+					}
+				}
+			}
 			break;
 		default:
 			error("unknown oldScript op %d", op);






More information about the Scummvm-git-logs mailing list