예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
void Overlays::remove(const Common::String &name) {
	int index = findByHash(MIXArchive::getHash(name));
	if (index >= 0) {
		resetSingle(index);
	}
}