int Overlays::play(const Common::String &name, int loopId, bool loopForever, bool startNow, int a6) { assert(name.size() <= 12); 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].vqaPlayer = new VQAPlayer(_vm, &_vm->_surfaceFront); // repeat forever _videos[index].vqaPlayer->setBeginAndEndFrame(0, 0, -1, kLoopSetModeJustStart, nullptr, nullptr); } Common::String resourceName = Common::String::format("%s.VQA", name.c_str()); _videos[index].vqaPlayer->open(resourceName); _videos[index].vqaPlayer->setLoop( loopId, loopForever ? -1 : 0, startNow ? kLoopSetModeImmediate : kLoopSetModeEnqueue, nullptr, nullptr); return index; }
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; }
bool TIGER::pack(uint32_t nameHash, string path) { // Find the element with hash. uint32_t id = findByHash(nameHash); // Create new file if needed. if (tigerFiles.size() < 5) { ofstream newFile(basePath + "bigfile.004.tiger"); if (newFile.is_open()) { for (int i = 0; i < 0x800 * 1024; i++) { newFile.write("\x00", 1); } header.NumberOfFiles = 5; tigerFiles[0]->seekg(0); tigerFiles[0]->seekp(0); tigerFiles[0]->write((char*)&header, sizeof(header)); tigerFiles[0]->flush(); newFile.close(); tigerFiles.push_back(new fstream(basePath + "bigfile.004.tiger", ios_base::in | ios_base::out | ios_base::binary)); } else { return false; } } // Create history file if necessary fstream history(basePath + "bigfile.tiger.history", ios_base::app); // Find and replace. uint32_t offset = elements[id].offset & 0xFFFFFF00; uint32_t file_no = elements[id].offset & 0x000000FF; tigerFiles[file_no]->seekg(offset); tigerFiles[file_no]->seekp(offset); char namehash[9]; sprintf_s(namehash, 9, "%08x", elements[id].nameHash); string filename(namehash); path = path + "\\" + filename; //int ret = system(cmd.c_str()); // DRM currentMode = PACK; uint32_t size = elements[id].size; bool ret = decodeDRM(tigerFiles[file_no], size, path, string("")); return true; }
void Overlays::remove(const Common::String &name) { int index = findByHash(MIXArchive::getHash(name)); if (index >= 0) { resetSingle(index); } }