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++) i->_surface.free(); delete _rnd; }
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, id); _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::unloadLibrary(uint id) { for (Common::List<Library>::iterator i = _libraries.begin(); i != _libraries.end(); i++) { if (i->_id != id) continue; for (Common::List<Animation *>::iterator j = _anims.begin(); j != _anims.end(); j++) { delete *j; } _anims.clear(); stopPipes(); _randomEvents.clear(); for (Common::List<Sprite>::iterator j = _sprites.begin(); j != _sprites.end(); j++) { j->_surface.free(); } _sprites.clear(); i->_buttons.clear(); _lastButton = NULL; _mixer->stopAll(); _audioStream = NULL; for (uint j = 0; j < _queuedScripts.size(); j++) { _queuedScripts[j]._count = 0; _queuedScripts[j]._scriptId = 0; } delete i->_archive; _libraries.erase(i); runEvent(kEventUnload, id, 0, 0); return; } error("tried to unload library %d, which isn't loaded", id); }
bool ComposerEngine::tickOldScript(OldScript *script) { if (script->_currDelay) { script->_currDelay--; return true; } bool running = true; bool erasedOldSprite = false; while (running && script->_stream->pos() < (int)script->_size) { uint16 spriteId, scriptId, buttonId, pipeId; Common::Point spritePos; script->_stream->skip(0); byte op = script->_stream->readByte(); switch (op) { case kOldOpNoOp: debug(3, "kOldOpNoOp()"); running = false; break; case kOldOpReplaceSprite: if (!erasedOldSprite) { removeSprite(0, script->_id); erasedOldSprite = true; } spriteId = script->_stream->readUint16LE(); spritePos.x = script->_stream->readSint16LE(); spritePos.y = script->_stream->readSint16LE(); debug(3, "kOldOpReplaceSprite(%d, %d, %d)", spriteId, spritePos.x, spritePos.y); addSprite(spriteId, script->_id, script->_zorder, spritePos); break; case kOldOpPlayWav: uint16 wavId, prio; wavId = script->_stream->readUint16LE(); prio = script->_stream->readUint16LE(); debug(3, "kOldOpPlayWav(%d, %d)", wavId, prio); playWaveForAnim(wavId, prio, false); break; case kOldOpRunScript: scriptId = script->_stream->readUint16LE(); debug(3, "kOldOpRunScript(%d)", scriptId); if (scriptId == script->_id) { // reset ourselves removeSprite(0, script->_id); script->_stream->seek(6); } else { runScript(scriptId); } break; case kOldOpStopScript: scriptId = script->_stream->readUint16LE(); debug(3, "kOldOpStopScript(%d)", scriptId); removeSprite(0, scriptId); stopOldScript(scriptId); break; case kOldOpActivateButton: buttonId = script->_stream->readUint16LE(); debug(3, "kOldOpActivateButton(%d)", buttonId); setButtonActive(buttonId, true); break; case kOldOpDeactivateButton: buttonId = script->_stream->readUint16LE(); debug(3, "kOldOpDeactivateButton(%d)", buttonId); setButtonActive(buttonId, false); break; case kOldOpDrawSprite: spriteId = script->_stream->readUint16LE(); spritePos.x = script->_stream->readSint16LE(); spritePos.y = script->_stream->readSint16LE(); debug(3, "kOldOpDrawSprite(%d, %d, %d)", spriteId, spritePos.x, spritePos.y); addSprite(spriteId, script->_id, script->_zorder, spritePos); break; case kOldOpRemoveSprite: spriteId = script->_stream->readUint16LE(); debug(3, "kOldOpRemoveSprite(%d)", spriteId); removeSprite(spriteId, script->_id); 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 kOldOpRandWait: uint16 min, max; min = script->_stream->readUint16LE(); max = script->_stream->readUint16LE(); debug(3, "kOldOpRandWait(%d, %d)", min, max); script->_currDelay = _rnd->getRandomNumberRng(min, max); break; case kOldOpDrawGlobalSprite: spriteId = script->_stream->readUint16LE(); spritePos.x = script->_stream->readSint16LE(); spritePos.y = script->_stream->readSint16LE(); debug(3, "kOldOpDrawGlobalSprite(%d, %d, %d)", spriteId, spritePos.x, spritePos.y); addSprite(spriteId, 0, script->_zorder, spritePos); break; case kOldOpRemoveGlobalSprite: spriteId = script->_stream->readUint16LE(); debug(3, "kOldOpRemoveGlobalSprite(%d)", spriteId); removeSprite(spriteId, 0); break; case kOldOpSetZOrder: script->_zorder = script->_stream->readUint16LE(); debug(3, "kOldOpSetZOrder(%d)", script->_zorder); break; case kOldOpPlayPipe: pipeId = script->_stream->readUint16LE(); debug(3, "kOldOpPlayPipe(%d)", pipeId); playPipe(pipeId); break; case kOldOpStopPipe: pipeId = script->_stream->readUint16LE(); debug(3, "kOldOpStopPipe(%d)", pipeId); // yes, pipeId is ignored here.. stopPipes(); 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; case kOldOpRunRandom: uint16 randomId; randomId = script->_stream->readUint16LE(); debug(3, "kOldOpRunRandom(%d)", randomId); 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); } } if (script->_stream->pos() >= (int)script->_size) { // stop running if we ran out of script removeSprite(0, script->_id); return false; } return true; }