[Scummvm-cvs-logs] SF.net SVN: scummvm: [31540] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Thu Apr 17 18:38:26 CEST 2008


Revision: 31540
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31540&view=rev
Author:   lordhoto
Date:     2008-04-17 09:38:26 -0700 (Thu, 17 Apr 2008)

Log Message:
-----------
Implemented support for Kyra3 TLK files.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/kyra_v3.cpp
    scummvm/trunk/engines/kyra/resource.cpp
    scummvm/trunk/engines/kyra/resource.h

Modified: scummvm/trunk/engines/kyra/kyra_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-17 16:35:16 UTC (rev 31539)
+++ scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-17 16:38:26 UTC (rev 31540)
@@ -619,8 +619,7 @@
 	}
 
 	_currentTalkFile = file;
-	//TODO: support Kyra3 TLK files
-	//_res->loadPakFile(talkFilename);
+	_res->loadPakFile(talkFilename);
 }
 
 #pragma mark -

Modified: scummvm/trunk/engines/kyra/resource.cpp
===================================================================
--- scummvm/trunk/engines/kyra/resource.cpp	2008-04-17 16:35:16 UTC (rev 31539)
+++ scummvm/trunk/engines/kyra/resource.cpp	2008-04-17 16:38:26 UTC (rev 31540)
@@ -630,9 +630,113 @@
 	return stream;
 }
 
+class ResLoaderTlk : public ResArchiveLoader {
+public:
+	bool checkFilename(Common::String filename) const;
+	bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const;
+	bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const;
+	Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const;
+
+	ResFileEntry::kType getType() const {
+		return ResFileEntry::kTlk;
+	}
+
+private:
+	static bool sortTlkFileList(const File &l, const File &r);
+	static FileList::const_iterator nextFile(const FileList &list, FileList::const_iterator iter);
+};
+
+bool ResLoaderTlk::checkFilename(Common::String filename) const {
+	filename.toUppercase();
+	return (filename.hasSuffix(".TLK"));
+}
+
+bool ResLoaderTlk::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const {
+	uint16 entries = stream.readUint16LE();
+	uint32 entryTableSize = (entries * 8);
+
+	if (entryTableSize + 2 > stream.size())
+		return false;
+
+	uint32 offset = 0;
+
+	for (uint i = 0; i < entries; ++i) {
+		stream.readUint32LE();
+		offset = stream.readUint32LE();
+
+		if (offset > stream.size())
+			return false;
+	}
+
+	return true;
+}
+
+bool ResLoaderTlk::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const {
+	uint16 entries = stream.readUint16LE();
+	
+	for (uint i = 0; i < entries; ++i) {
+		ResFileEntry entry;
+		entry.parent = filename;
+		entry.type = ResFileEntry::kAutoDetect;
+		entry.mounted = false;
+		entry.preload = false;
+		entry.prot = false;
+
+		uint32 filename = stream.readUint32LE();
+		uint32 offset = stream.readUint32LE();
+
+		entry.offset = offset;
+		entry.size = 0;
+
+		char realFilename[20];
+		snprintf(realFilename, 20, "%.08u.AUD", filename);
+
+		files.push_back(FileList::value_type(realFilename, entry));
+	}
+
+	Common::sort(files.begin(), files.end(), ResLoaderTlk::sortTlkFileList);
+
+	for (FileList::iterator iter = files.begin(); iter != files.end(); ++iter) {
+		FileList::const_iterator next = ResLoaderTlk::nextFile(files, iter);
+		uint32 endOffset = (next == files.end() ? stream.size() : next->entry.offset);
+	
+		assert(endOffset >= iter->entry.offset);
+
+		iter->entry.size = endOffset - iter->entry.offset;
+	}
+
+	return true;
+}
+
+Common::SeekableReadStream *ResLoaderTlk::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const {
+	assert(archive);
+
+	archive->seek(entry.offset, SEEK_SET);
+	Common::SeekableSubReadStream *stream = new Common::SeekableSubReadStream(archive, entry.offset, entry.offset + entry.size, true);
+	assert(stream);
+	return stream;
+}
+
+bool ResLoaderTlk::sortTlkFileList(const File &l, const File &r) {
+	return (l.entry.offset < r.entry.offset);
+}
+
+ResLoaderTlk::FileList::const_iterator ResLoaderTlk::nextFile(const FileList &list, FileList::const_iterator iter) {
+	ResArchiveLoader::FileList::const_iterator next = iter;
+	while ((++next) != list.end()) {
+		if (next->entry.offset != iter->entry.offset)
+			return next;
+	}
+
+	return next;
+}
+
+#pragma mark -
+
 void Resource::initializeLoaders() {
 	_loaders.push_back(LoaderList::value_type(new ResLoaderPak()));
 	_loaders.push_back(LoaderList::value_type(new ResLoaderIns()));
+	_loaders.push_back(LoaderList::value_type(new ResLoaderTlk()));
 }
 
 const ResArchiveLoader *Resource::getLoader(ResFileEntry::kType type) const {

Modified: scummvm/trunk/engines/kyra/resource.h
===================================================================
--- scummvm/trunk/engines/kyra/resource.h	2008-04-17 16:35:16 UTC (rev 31539)
+++ scummvm/trunk/engines/kyra/resource.h	2008-04-17 16:38:26 UTC (rev 31540)
@@ -53,6 +53,7 @@
 		kRaw = 0,
 		kPak = 1,
 		kIns = 2,
+		kTlk = 3,
 		kAutoDetect
 	};
 	kType type;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list