aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/composer/composer.cpp14
-rw-r--r--engines/composer/composer.h16
-rw-r--r--engines/composer/scripting.cpp128
3 files changed, 157 insertions, 1 deletions
diff --git a/engines/composer/composer.cpp b/engines/composer/composer.cpp
index 9f4936b8c8..eb7df95ec3 100644
--- a/engines/composer/composer.cpp
+++ b/engines/composer/composer.cpp
@@ -53,6 +53,8 @@ ComposerEngine::ComposerEngine(OSystem *syst, const ComposerGameDescription *gam
ComposerEngine::~ComposerEngine() {
DebugMan.clearAllDebugChannels();
+ for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.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++)
@@ -156,6 +158,7 @@ Common::Error ComposerEngine::run() {
redraw();
+ tickOldScripts();
processAnimFrame();
} else if (_needsUpdate) {
redraw();
@@ -326,6 +329,17 @@ Common::String ComposerEngine::mangleFilename(Common::String filename) {
}
void ComposerEngine::loadLibrary(uint id) {
+ if (getGameType() == GType_ComposerV1 && !_libraries.empty()) {
+ // kill the previous page, starting with any scripts running on it
+
+ for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.end(); i++)
+ delete *i;
+ _oldScripts.clear();
+
+ Library *library = &_libraries.front();
+ unloadLibrary(library->_id);
+ }
+
Common::String filename;
if (getGameType() == GType_ComposerV1) {
diff --git a/engines/composer/composer.h b/engines/composer/composer.h
index 524c2869ba..1816d89d60 100644
--- a/engines/composer/composer.h
+++ b/engines/composer/composer.h
@@ -116,6 +116,18 @@ struct PendingPageChange {
bool _remove;
};
+struct OldScript {
+ OldScript(uint16 id, Common::SeekableReadStream *stream);
+ ~OldScript();
+
+ uint16 _id;
+
+ uint32 _size;
+ Common::SeekableReadStream *_stream;
+
+ uint32 _currDelay;
+};
+
class ComposerEngine : public Engine {
protected:
Common::Error run();
@@ -156,6 +168,7 @@ private:
Common::Array<uint16> _stack;
Common::Array<uint16> _vars;
+ Common::List<OldScript *> _oldScripts;
Common::Array<QueuedScript> _queuedScripts;
Common::List<Animation *> _anims;
Common::List<Pipe *> _pipes;
@@ -189,6 +202,9 @@ private:
void setArg(uint16 arg, uint16 type, uint16 val);
void runScript(uint16 id);
int16 scriptFuncCall(uint16 id, int16 param1, int16 param2, int16 param3);
+ void runOldScript(uint16 id, uint16 wait);
+ void tickOldScripts();
+ bool tickOldScript(OldScript *script);
void playAnimation(uint16 animId, int16 param1, int16 param2, int16 param3);
void stopAnimation(Animation *anim, bool localOnly = false, bool pipesOnly = false);
diff --git a/engines/composer/scripting.cpp b/engines/composer/scripting.cpp
index 1989919233..41e9151279 100644
--- a/engines/composer/scripting.cpp
+++ b/engines/composer/scripting.cpp
@@ -122,6 +122,11 @@ void ComposerEngine::runEvent(uint16 id, int16 param1, int16 param2, int16 param
}
int16 ComposerEngine::runScript(uint16 id, int16 param1, int16 param2, int16 param3) {
+ if (getGameType() == GType_ComposerV1) {
+ runOldScript(id, param1);
+ return 0;
+ }
+
_vars[1] = param1;
_vars[2] = param2;
_vars[3] = param3;
@@ -155,10 +160,14 @@ void ComposerEngine::setArg(uint16 arg, uint16 type, uint16 val) {
default:
error("invalid argument type %d (setting arg %d)", type, arg);
}
-
}
void ComposerEngine::runScript(uint16 id) {
+ if (getGameType() == GType_ComposerV1) {
+ runOldScript(id, 0);
+ return;
+ }
+
if (!hasResource(ID_SCRP, id)) {
debug(1, "ignoring attempt to run script %d, because it doesn't exist", id);
return;
@@ -726,4 +735,121 @@ int16 ComposerEngine::scriptFuncCall(uint16 id, int16 param1, int16 param2, int1
}
}
+OldScript::OldScript(uint16 id, Common::SeekableReadStream *stream) : _id(id), _stream(stream) {
+ _size = _stream->readUint32LE();
+ _stream->skip(2);
+ _currDelay = 0;
+}
+
+OldScript::~OldScript() {
+ delete _stream;
+}
+
+void ComposerEngine::runOldScript(uint16 id, uint16 wait) {
+ // FIXME: kill any old script
+
+ Common::SeekableReadStream *stream = getResource(ID_SCRP, id);
+ OldScript *script = new OldScript(id, stream);
+ script->_currDelay = wait;
+ _oldScripts.push_back(script);
+}
+
+void ComposerEngine::tickOldScripts() {
+ for (Common::List<OldScript *>::iterator i = _oldScripts.begin(); i != _oldScripts.end(); i++) {
+ if (!tickOldScript(*i)) {
+ delete *i;
+ i = _oldScripts.reverse_erase(i);
+ }
+ }
+}
+
+enum {
+ kOldOpNoOp = 0,
+ kOldOpDrawSprite = 1,
+ kOldOpPlayWav = 2,
+ kOldOpRunScript = 3,
+ // FIXME
+ kOldOpDisableMouseInput = 9,
+ kOldOpEnableMouseInput = 10,
+ kOldOpWait = 11,
+ kOldOpPlayPipe = 16,
+ // FIXME
+ kOldOpNewScreen = 20
+ // FIXME
+};
+
+bool ComposerEngine::tickOldScript(OldScript *script) {
+ if (script->_currDelay) {
+ script->_currDelay--;
+ return true;
+ }
+
+ script->_stream->skip(0);
+ bool running = true;
+ while (running && script->_stream->pos() < (int)script->_size) {
+ byte op = script->_stream->readByte();
+ switch (op) {
+ case kOldOpNoOp:
+ debug(3, "kOldOpNoOp");
+ running = false;
+ break;
+ case kOldOpDrawSprite:
+ uint16 spriteId, x, y;
+ spriteId = script->_stream->readUint16LE();
+ x = script->_stream->readUint16LE();
+ y = script->_stream->readUint16LE();
+ // FIXME
+ break;
+ case kOldOpRunScript:
+ uint16 newScriptId;
+ newScriptId = script->_stream->readUint16LE();
+ debug(3, "kOldOpRunScript(%d)", newScriptId);
+ if (newScriptId == script->_id) {
+ // reset ourselves
+ // FIXME: erase sprite
+ script->_stream->seek(6);
+ } else {
+ runScript(newScriptId);
+ }
+ break;
+ case kOldOpDisableMouseInput:
+ debug(3, "kOldOpDisableMouseInput");
+ setCursorVisible(false);
+ break;
+ case kOldOpEnableMouseInput:
+ debug(3, "kOldOpEnableMouseInput");
+ setCursorVisible(true);
+ break;
+ case kOldOpWait:
+ script->_currDelay = script->_stream->readUint16LE();
+ debug(3, "kOldOpWait(%d)", script->_currDelay);
+ break;
+ case kOldOpPlayPipe:
+ uint16 pipeId;
+ pipeId = script->_stream->readUint16LE();
+ debug(3, "kOldOpPlayPipe(%d)", pipeId);
+ // FIXME
+ break;
+ case kOldOpNewScreen:
+ uint16 newScreenId;
+ newScreenId = script->_stream->readUint16LE();
+ debug(3, "kOldOpNewScreen(%d)", newScreenId);
+ if (!newScreenId) {
+ quitGame();
+ } else {
+ _pendingPageChanges.clear();
+ _pendingPageChanges.push_back(PendingPageChange(newScreenId, false));
+ }
+ break;
+ default:
+ // FIXME: error
+ warning("unknown oldScript op %d", op);
+ }
+ }
+
+ // FIXME: EraseSprite and give up if we exceded size
+
+ return true;
+}
+
} // End of namespace Composer