int Overlays::play(const Common::String &name, int loopId, bool loopForever, bool startNow, int a6) { assert(name.size() <= 12); if (loopId < 0) { warning("Overlays::play - loop id can't be a negative number!"); return -1; } int32 hash = MIXArchive::getHash(name); int index = findByHash(hash); if (index < 0) { index = findEmpty(); if (index < 0) { return index; } _videos[index].loaded = true; _videos[index].name = name; _videos[index].hash = hash; _videos[index].loopId = loopId; _videos[index].enqueuedLoopId = -1; _videos[index].loopForever = loopForever; _videos[index].vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceFront, Common::String::format("%s.VQA", name.c_str())); if (!_videos[index].vqaPlayer) { resetSingle(index); return -1; } // TODO? Removed as redundant // repeat forever //_videos[index].vqaPlayer->setBeginAndEndFrame(0, 0, -1, kLoopSetModeJustStart, nullptr, nullptr); } bool skipNewVQAPlayerOpen = false; if (_videos[index].vqaPlayer && !startNow && _videos[index].vqaPlayer->getFrameCount() > 0 ) { skipNewVQAPlayerOpen = true; _videos[index].enqueuedLoopId = loopId; } if (skipNewVQAPlayerOpen || _videos[index].vqaPlayer->open()) { _videos[index].vqaPlayer->setLoop( loopId, loopForever ? -1 : 0, startNow ? kLoopSetModeImmediate : kLoopSetModeEnqueue, nullptr, nullptr); } else { resetSingle(index); return -1; } return index; }
void Overlays::removeAll() { for (int i = 0; i < kOverlayVideos; ++i) { if (_videos[i].loaded) { resetSingle(i); } } }
Overlays::~Overlays() { for (int i = 0; i < kOverlayVideos; ++i) { resetSingle(i); } _videos.clear(); reset(); }
void Overlays::remove(const Common::String &name) { int id = mix_id(name); int index = findById(id); if (index >= 0) { resetSingle(index); } }
void Overlays::tick() { for (int i = 0; i < kOverlayVideos; ++i) { if (_videos[i].loaded) { int frame = _videos[i].vqaPlayer->update(true); if (frame < 0) { resetSingle(i); } } } }
bool Overlays::init() { reset(); _videos.resize(kOverlayVideos); for (int i = 0; i < kOverlayVideos; ++i) { _videos[i].vqaPlayer = nullptr; resetSingle(i); } return true; }
void RespTable::cleanObject(DtObjectRef obj) { resetSingle(obj); for (PairList::const_iterator i = pairList.begin(); i != pairList.end(); ++i) { if ((*i).first.first == obj) { partnerList.push_back((*i).first.second); } else if ((*i).first.second == obj) { partnerList.push_back((*i).first.first); } } while (!partnerList.empty()) { resetPair(obj, partnerList.back()); partnerList.pop_back(); } }
void Overlays::resume(bool isLoadingGame) { for (int i = 0; i < kOverlayVideos; ++i) { if (_videos[i].loaded && isLoadingGame) { _videos[i].vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceFront, Common::String::format("%s.VQA", _videos[i].name.c_str())); if (!_videos[i].vqaPlayer) { resetSingle(i); continue; } _videos[i].vqaPlayer->open(); _videos[i].vqaPlayer->setLoop( _videos[i].loopId, _videos[i].loopForever ? -1 : 0, kLoopSetModeImmediate, nullptr, nullptr); _videos[i].vqaPlayer->seekToFrame(_videos[i].frame); _videos[i].vqaPlayer->update(true); } } }
void Overlays::remove(const Common::String &name) { int index = findByHash(MIXArchive::getHash(name)); if (index >= 0) { resetSingle(index); } }