[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