[Scummvm-cvs-logs] scummvm master -> f2eee1759f922640b08ac3420f50f0a9c05e0588

bluegr bluegr at gmail.com
Wed Dec 3 01:17:48 CET 2014


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
bbec6c913a ZVISION: Document some more cheats for ZGI
f578a1b334 ZVISION: Move the key mapper function
f2eee1759f ZVISION: Move the ZfsArchive class


Commit: bbec6c913ac6ad4279e3549fc903b9c6e4521f50
    https://github.com/scummvm/scummvm/commit/bbec6c913ac6ad4279e3549fc903b9c6e4521f50
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-12-03T01:58:07+02:00

Commit Message:
ZVISION: Document some more cheats for ZGI

Thanks to marisa-chan for providing the location of those in pull
request #532

Changed paths:
    engines/zvision/core/events.cpp



diff --git a/engines/zvision/core/events.cpp b/engines/zvision/core/events.cpp
index e3bcf6f..2c0e63b 100644
--- a/engines/zvision/core/events.cpp
+++ b/engines/zvision/core/events.cpp
@@ -71,9 +71,8 @@ void ZVision::cheatCodes(uint8 key) {
 	pushKeyToCheatBuf(key);
 
 	if (getGameId() == GID_GRANDINQUISITOR) {
-
 		if (checkCode("IMNOTDEAF")) {
-			// Unknow cheat
+			// Unknown cheat
 			showDebugMsg(Common::String::format("IMNOTDEAF cheat or debug, not implemented"));
 		}
 
@@ -93,8 +92,12 @@ void ZVision::cheatCodes(uint8 key) {
 		if (checkCode("MIKESPANTS")) {
 			_scriptManager->changeLocation('g', 'j', 't', 'm', 0);
 		}
-	} else if (getGameId() == GID_NEMESIS) {
 
+		// There are 3 more cheats in script files:
+		// - "EAT ME": gjcr.scr
+		// - "WHOAMI": hp1e.scr
+		// - "HUISOK": uh1f.scr
+	} else if (getGameId() == GID_NEMESIS) {
 		if (checkCode("CHLOE")) {
 			_scriptManager->changeLocation('t', 'm', '2', 'g', 0);
 			_scriptManager->setStateValue(224, 1);


Commit: f578a1b3342578594d9940894a525bf3983641ff
    https://github.com/scummvm/scummvm/commit/f578a1b3342578594d9940894a525bf3983641ff
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-12-03T02:11:50+02:00

Commit Message:
ZVISION: Move the key mapper function

Changed paths:
  R engines/zvision/utility/win_keys.cpp
  R engines/zvision/utility/win_keys.h
    engines/zvision/core/events.cpp
    engines/zvision/module.mk
    engines/zvision/zvision.h



diff --git a/engines/zvision/core/events.cpp b/engines/zvision/core/events.cpp
index 2c0e63b..52d71c9 100644
--- a/engines/zvision/core/events.cpp
+++ b/engines/zvision/core/events.cpp
@@ -30,8 +30,6 @@
 #include "zvision/scripting/script_manager.h"
 #include "zvision/animation/rlf_animation.h"
 #include "zvision/core/menu.h"
-#include "zvision/utility/win_keys.h"
-#include "zvision/core/menu.h"
 #include "zvision/sound/zork_raw.h"
 
 #include "common/events.h"
@@ -214,7 +212,7 @@ void ZVision::processEvents() {
 				break;
 			}
 
-			uint8 vkKey = VKkey(_event.kbd.keycode);
+			uint8 vkKey = getZvisionKey(_event.kbd.keycode);
 
 			_scriptManager->setStateValue(StateKey_KeyPress, vkKey);
 
@@ -342,4 +340,106 @@ void ZVision::onMouseMove(const Common::Point &pos) {
 	}
 }
 
+uint8 ZVision::getZvisionKey(Common::KeyCode scummKeyCode) {
+	if (scummKeyCode >= Common::KEYCODE_a && scummKeyCode <= Common::KEYCODE_z)
+		return 0x41 + scummKeyCode - Common::KEYCODE_a;
+	if (scummKeyCode >= Common::KEYCODE_0 && scummKeyCode <= Common::KEYCODE_9)
+		return 0x30 + scummKeyCode - Common::KEYCODE_0;
+	if (scummKeyCode >= Common::KEYCODE_F1 && scummKeyCode <= Common::KEYCODE_F15)
+		return 0x70 + scummKeyCode - Common::KEYCODE_F1;
+	if (scummKeyCode >= Common::KEYCODE_KP0 && scummKeyCode <= Common::KEYCODE_KP9)
+		return 0x60 + scummKeyCode - Common::KEYCODE_KP0;
+
+	switch (scummKeyCode) {
+	case Common::KEYCODE_BACKSPACE:
+		return 0x8;
+	case Common::KEYCODE_TAB:
+		return 0x9;
+	case Common::KEYCODE_CLEAR:
+		return 0xC;
+	case Common::KEYCODE_RETURN:
+		return 0xD;
+	case Common::KEYCODE_CAPSLOCK:
+		return 0x14;
+	case Common::KEYCODE_ESCAPE:
+		return 0x1B;
+	case Common::KEYCODE_SPACE:
+		return 0x20;
+	case Common::KEYCODE_PAGEUP:
+		return 0x21;
+	case Common::KEYCODE_PAGEDOWN:
+		return 0x22;
+	case Common::KEYCODE_END:
+		return 0x23;
+	case Common::KEYCODE_HOME:
+		return 0x24;
+	case Common::KEYCODE_LEFT:
+		return 0x25;
+	case Common::KEYCODE_UP:
+		return 0x26;
+	case Common::KEYCODE_RIGHT:
+		return 0x27;
+	case Common::KEYCODE_DOWN:
+		return 0x28;
+	case Common::KEYCODE_PRINT:
+		return 0x2A;
+	case Common::KEYCODE_INSERT:
+		return 0x2D;
+	case Common::KEYCODE_DELETE:
+		return 0x2E;
+	case Common::KEYCODE_HELP:
+		return 0x2F;
+	case Common::KEYCODE_KP_MULTIPLY:
+		return 0x6A;
+	case Common::KEYCODE_KP_PLUS:
+		return 0x6B;
+	case Common::KEYCODE_KP_MINUS:
+		return 0x6D;
+	case Common::KEYCODE_KP_PERIOD:
+		return 0x6E;
+	case Common::KEYCODE_KP_DIVIDE:
+		return 0x6F;
+	case Common::KEYCODE_NUMLOCK:
+		return 0x90;
+	case Common::KEYCODE_SCROLLOCK:
+		return 0x91;
+	case Common::KEYCODE_LSHIFT:
+		return 0xA0;
+	case Common::KEYCODE_RSHIFT:
+		return 0xA1;
+	case Common::KEYCODE_LCTRL:
+		return 0xA2;
+	case Common::KEYCODE_RCTRL:
+		return 0xA3;
+	case Common::KEYCODE_MENU:
+		return 0xA5;
+	case Common::KEYCODE_LEFTBRACKET:
+		return 0xDB;
+	case Common::KEYCODE_RIGHTBRACKET:
+		return 0xDD;
+	case Common::KEYCODE_SEMICOLON:
+		return 0xBA;
+	case Common::KEYCODE_BACKSLASH:
+		return 0xDC;
+	case Common::KEYCODE_QUOTE:
+		return 0xDE;
+	case Common::KEYCODE_SLASH:
+		return 0xBF;
+	case Common::KEYCODE_TILDE:
+		return 0xC0;
+	case Common::KEYCODE_COMMA:
+		return 0xBC;
+	case Common::KEYCODE_PERIOD:
+		return 0xBE;
+	case Common::KEYCODE_MINUS:
+		return 0xBD;
+	case Common::KEYCODE_PLUS:
+		return 0xBB;
+	default:
+		return 0;
+	}
+
+	return 0;
+}
+
 } // End of namespace ZVision
diff --git a/engines/zvision/module.mk b/engines/zvision/module.mk
index 140074c..5efd6d4 100644
--- a/engines/zvision/module.mk
+++ b/engines/zvision/module.mk
@@ -48,7 +48,6 @@ MODULE_OBJS := \
 	utility/clock.o \
 	utility/lzss_read_stream.o \
 	utility/utility.o \
-	utility/win_keys.o \
 	video/video.o \
 	video/zork_avi_decoder.o \
 	zvision.o
diff --git a/engines/zvision/utility/win_keys.cpp b/engines/zvision/utility/win_keys.cpp
deleted file mode 100644
index 86ed7c5..0000000
--- a/engines/zvision/utility/win_keys.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/keyboard.h"
-
-namespace ZVision {
-
-uint8 VKkey(Common::KeyCode scummKeyCode) {
-	if (scummKeyCode >= Common::KEYCODE_a && scummKeyCode <= Common::KEYCODE_z)
-		return 0x41 + scummKeyCode - Common::KEYCODE_a;
-	if (scummKeyCode >= Common::KEYCODE_0 && scummKeyCode <= Common::KEYCODE_9)
-		return 0x30 + scummKeyCode - Common::KEYCODE_0;
-	if (scummKeyCode >= Common::KEYCODE_F1 && scummKeyCode <= Common::KEYCODE_F15)
-		return 0x70 + scummKeyCode - Common::KEYCODE_F1;
-	if (scummKeyCode >= Common::KEYCODE_KP0 && scummKeyCode <= Common::KEYCODE_KP9)
-		return 0x60 + scummKeyCode - Common::KEYCODE_KP0;
-
-	switch (scummKeyCode) {
-	case Common::KEYCODE_BACKSPACE:
-		return 0x8;
-	case Common::KEYCODE_TAB:
-		return 0x9;
-	case Common::KEYCODE_CLEAR:
-		return 0xC;
-	case Common::KEYCODE_RETURN:
-		return 0xD;
-	case Common::KEYCODE_CAPSLOCK:
-		return 0x14;
-	case Common::KEYCODE_ESCAPE:
-		return 0x1B;
-	case Common::KEYCODE_SPACE:
-		return 0x20;
-	case Common::KEYCODE_PAGEUP:
-		return 0x21;
-	case Common::KEYCODE_PAGEDOWN:
-		return 0x22;
-	case Common::KEYCODE_END:
-		return 0x23;
-	case Common::KEYCODE_HOME:
-		return 0x24;
-	case Common::KEYCODE_LEFT:
-		return 0x25;
-	case Common::KEYCODE_UP:
-		return 0x26;
-	case Common::KEYCODE_RIGHT:
-		return 0x27;
-	case Common::KEYCODE_DOWN:
-		return 0x28;
-	case Common::KEYCODE_PRINT:
-		return 0x2A;
-	case Common::KEYCODE_INSERT:
-		return 0x2D;
-	case Common::KEYCODE_DELETE:
-		return 0x2E;
-	case Common::KEYCODE_HELP:
-		return 0x2F;
-	case Common::KEYCODE_KP_MULTIPLY:
-		return 0x6A;
-	case Common::KEYCODE_KP_PLUS:
-		return 0x6B;
-	case Common::KEYCODE_KP_MINUS:
-		return 0x6D;
-	case Common::KEYCODE_KP_PERIOD:
-		return 0x6E;
-	case Common::KEYCODE_KP_DIVIDE:
-		return 0x6F;
-	case Common::KEYCODE_NUMLOCK:
-		return 0x90;
-	case Common::KEYCODE_SCROLLOCK:
-		return 0x91;
-	case Common::KEYCODE_LSHIFT:
-		return 0xA0;
-	case Common::KEYCODE_RSHIFT:
-		return 0xA1;
-	case Common::KEYCODE_LCTRL:
-		return 0xA2;
-	case Common::KEYCODE_RCTRL:
-		return 0xA3;
-	case Common::KEYCODE_MENU:
-		return 0xA5;
-	case Common::KEYCODE_LEFTBRACKET:
-		return 0xDB;
-	case Common::KEYCODE_RIGHTBRACKET:
-		return 0xDD;
-	case Common::KEYCODE_SEMICOLON:
-		return 0xBA;
-	case Common::KEYCODE_BACKSLASH:
-		return 0xDC;
-	case Common::KEYCODE_QUOTE:
-		return 0xDE;
-	case Common::KEYCODE_SLASH:
-		return 0xBF;
-	case Common::KEYCODE_TILDE:
-		return 0xC0;
-	case Common::KEYCODE_COMMA:
-		return 0xBC;
-	case Common::KEYCODE_PERIOD:
-		return 0xBE;
-	case Common::KEYCODE_MINUS:
-		return 0xBD;
-	case Common::KEYCODE_PLUS:
-		return 0xBB;
-	default:
-		return 0;
-	}
-
-	return 0;
-}
-
-}
diff --git a/engines/zvision/utility/win_keys.h b/engines/zvision/utility/win_keys.h
deleted file mode 100644
index 53d76c4..0000000
--- a/engines/zvision/utility/win_keys.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef ZVISION_WIN_KEYS_H
-#define ZVISION_WIN_KEYS_H
-
-#include "common/keyboard.h"
-
-namespace ZVision {
-uint8 VKkey(Common::KeyCode scummKeyCode);
-} // End of namespace ZVision
-
-#endif
diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h
index ae49f06..ca6c8e1 100644
--- a/engines/zvision/zvision.h
+++ b/engines/zvision/zvision.h
@@ -163,6 +163,8 @@ public:
 		return _gameDescription->gameId;
 	}
 
+	uint8 getZvisionKey(Common::KeyCode scummKeyCode);
+
 	/**
 	 * Play a video until it is finished. This is a blocking call. It will call
 	 * _clock.stop() when the video starts and _clock.start() when the video finishes.
@@ -196,7 +198,6 @@ public:
 
 	void checkBorders();
 	void showDebugMsg(const Common::String &msg, int16 delay = 3000);
-
 private:
 	void initialize();
 	void initFonts();


Commit: f2eee1759f922640b08ac3420f50f0a9c05e0588
    https://github.com/scummvm/scummvm/commit/f2eee1759f922640b08ac3420f50f0a9c05e0588
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2014-12-03T02:16:14+02:00

Commit Message:
ZVISION: Move the ZfsArchive class

Changed paths:
  A engines/zvision/utility/zfs_archive.cpp
  A engines/zvision/utility/zfs_archive.h
  R engines/zvision/archives/zfs_archive.cpp
  R engines/zvision/archives/zfs_archive.h
    engines/zvision/core/search_manager.cpp
    engines/zvision/module.mk
    engines/zvision/zvision.cpp



diff --git a/engines/zvision/archives/zfs_archive.cpp b/engines/zvision/archives/zfs_archive.cpp
deleted file mode 100644
index 416719b..0000000
--- a/engines/zvision/archives/zfs_archive.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/scummsys.h"
-
-#include "zvision/archives/zfs_archive.h"
-
-#include "common/memstream.h"
-#include "common/debug.h"
-#include "common/file.h"
-
-namespace ZVision {
-
-ZfsArchive::ZfsArchive(const Common::String &fileName) : _fileName(fileName) {
-	Common::File zfsFile;
-
-	if (!zfsFile.open(_fileName)) {
-		warning("ZFSArchive::ZFSArchive(): Could not find the archive file");
-		return;
-	}
-
-	readHeaders(&zfsFile);
-
-	debug(1, "ZfsArchive::ZfsArchive(%s): Located %d files", _fileName.c_str(), _entryHeaders.size());
-}
-
-ZfsArchive::ZfsArchive(const Common::String &fileName, Common::SeekableReadStream *stream) : _fileName(fileName) {
-	readHeaders(stream);
-
-	debug(1, "ZfsArchive::ZfsArchive(%s): Located %d files", _fileName.c_str(), _entryHeaders.size());
-}
-
-ZfsArchive::~ZfsArchive() {
-	debug(1, "ZfsArchive Destructor Called");
-	ZfsEntryHeaderMap::iterator it = _entryHeaders.begin();
-	for (; it != _entryHeaders.end(); ++it) {
-		delete it->_value;
-	}
-}
-
-void ZfsArchive::readHeaders(Common::SeekableReadStream *stream) {
-	// Don't do a straight struct cast since we can't guarantee endianness
-	_header.magic = stream->readUint32LE();
-	_header.unknown1 = stream->readUint32LE();
-	_header.maxNameLength = stream->readUint32LE();
-	_header.filesPerBlock = stream->readUint32LE();
-	_header.fileCount = stream->readUint32LE();
-	_header.xorKey[0] = stream->readByte();
-	_header.xorKey[1] = stream->readByte();
-	_header.xorKey[2] = stream->readByte();
-	_header.xorKey[3] = stream->readByte();
-	_header.fileSectionOffset = stream->readUint32LE();
-
-	uint32 nextOffset;
-
-	do {
-		// Read the offset to the next block
-		nextOffset = stream->readUint32LE();
-
-		// Read in each entry header
-		for (uint32 i = 0; i < _header.filesPerBlock; ++i) {
-			ZfsEntryHeader entryHeader;
-
-			entryHeader.name = readEntryName(stream);
-			entryHeader.offset = stream->readUint32LE();
-			entryHeader.id = stream->readUint32LE();
-			entryHeader.size = stream->readUint32LE();
-			entryHeader.time = stream->readUint32LE();
-			entryHeader.unknown = stream->readUint32LE();
-
-			if (entryHeader.size != 0)
-				_entryHeaders[entryHeader.name] = new ZfsEntryHeader(entryHeader);
-		}
-
-		// Seek to the next block of headers
-		stream->seek(nextOffset);
-	} while (nextOffset != 0);
-}
-
-Common::String ZfsArchive::readEntryName(Common::SeekableReadStream *stream) const {
-	// Entry Names are at most 16 bytes and are null padded
-	char buffer[16];
-	stream->read(buffer, 16);
-
-	return Common::String(buffer);
-}
-
-bool ZfsArchive::hasFile(const Common::String &name) const {
-	return _entryHeaders.contains(name);
-}
-
-int ZfsArchive::listMembers(Common::ArchiveMemberList &list) const {
-	int matches = 0;
-
-	for (ZfsEntryHeaderMap::const_iterator it = _entryHeaders.begin(); it != _entryHeaders.end(); ++it) {
-		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->name, this)));
-		matches++;
-	}
-
-	return matches;
-}
-
-const Common::ArchiveMemberPtr ZfsArchive::getMember(const Common::String &name) const {
-	if (!_entryHeaders.contains(name))
-		return Common::ArchiveMemberPtr();
-
-	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
-}
-
-Common::SeekableReadStream *ZfsArchive::createReadStreamForMember(const Common::String &name) const {
-	if (!_entryHeaders.contains(name)) {
-		return 0;
-	}
-
-	ZfsEntryHeader *entryHeader = _entryHeaders[name];
-
-	Common::File zfsArchive;
-	zfsArchive.open(_fileName);
-	zfsArchive.seek(entryHeader->offset);
-
-	// This *HAS* to be malloc (not new[]) because MemoryReadStream uses free() to free the memory
-	byte *buffer = (byte *)malloc(entryHeader->size);
-	zfsArchive.read(buffer, entryHeader->size);
-	// Decrypt the data in place
-	if (_header.xorKey != 0)
-		unXor(buffer, entryHeader->size, _header.xorKey);
-
-	return new Common::MemoryReadStream(buffer, entryHeader->size, DisposeAfterUse::YES);
-}
-
-void ZfsArchive::unXor(byte *buffer, uint32 length, const byte *xorKey) const {
-	for (uint32 i = 0; i < length; ++i)
-		buffer[i] ^= xorKey[i % 4];
-}
-
-} // End of namespace ZVision
diff --git a/engines/zvision/archives/zfs_archive.h b/engines/zvision/archives/zfs_archive.h
deleted file mode 100644
index 571591a..0000000
--- a/engines/zvision/archives/zfs_archive.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef ZVISION_ZFS_ARCHIVE_H
-#define ZVISION_ZFS_ARCHIVE_H
-
-#include "common/archive.h"
-#include "common/hashmap.h"
-#include "common/hash-str.h"
-
-namespace Common {
-class String;
-}
-
-namespace ZVision {
-
-struct ZfsHeader {
-	uint32 magic;
-	uint32 unknown1;
-	uint32 maxNameLength;
-	uint32 filesPerBlock;
-	uint32 fileCount;
-	byte xorKey[4];
-	uint32 fileSectionOffset;
-};
-
-struct ZfsEntryHeader {
-	Common::String name;
-	uint32 offset;
-	uint32 id;
-	uint32 size;
-	uint32 time;
-	uint32 unknown;
-};
-
-typedef Common::HashMap<Common::String, ZfsEntryHeader *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ZfsEntryHeaderMap;
-
-class ZfsArchive : public Common::Archive {
-public:
-	ZfsArchive(const Common::String &fileName);
-	ZfsArchive(const Common::String &fileName, Common::SeekableReadStream *stream);
-	~ZfsArchive();
-
-	/**
-	 * Check if a member with the given name is present in the Archive.
-	 * Patterns are not allowed, as this is meant to be a quick File::exists()
-	 * replacement.
-	 */
-	bool hasFile(const Common::String &fileName) const;
-
-	/**
-	 * Add all members of the Archive to list.
-	 * Must only append to list, and not remove elements from it.
-	 *
-	 * @return    The number of names added to list
-	 */
-	int listMembers(Common::ArchiveMemberList &list) const;
-
-	/**
-	 * Returns a ArchiveMember representation of the given file.
-	 */
-	const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
-
-	/**
-	 * Create a stream bound to a member with the specified name in the
-	 * archive. If no member with this name exists, 0 is returned.
-	 *
-	 * @return    The newly created input stream
-	 */
-	Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
-
-private:
-	const Common::String _fileName;
-	ZfsHeader _header;
-	ZfsEntryHeaderMap _entryHeaders;
-
-	/**
-	 * Parses the zfs file into file entry headers that can be used later
-	 * to get the entry data.
-	 *
-	 * @param stream    The contents of the zfs file
-	 */
-	void readHeaders(Common::SeekableReadStream *stream);
-
-	/**
-	 * Entry names are contained within a 16 byte block. This reads the block
-	 * and converts it the name to a Common::String
-	 *
-	 * @param stream    The zfs file stream
-	 * @return          The entry file name
-	 */
-	Common::String readEntryName(Common::SeekableReadStream *stream) const;
-
-	/**
-	 * ZFS file entries can be encrypted using XOR encoding. This method
-	 * decodes the buffer in place using the supplied xorKey.
-	 *
-	 * @param buffer    The data to decode
-	 * @param length    Length of buffer
-	 */
-	void unXor(byte *buffer, uint32 length, const byte *xorKey) const;
-};
-
-} // End of namespace ZVision
-
-#endif
diff --git a/engines/zvision/core/search_manager.cpp b/engines/zvision/core/search_manager.cpp
index 1e9643d..9c5d8fb 100644
--- a/engines/zvision/core/search_manager.cpp
+++ b/engines/zvision/core/search_manager.cpp
@@ -21,12 +21,12 @@
 */
 
 #include "common/debug.h"
-
-#include "zvision/core/search_manager.h"
-#include "zvision/archives/zfs_archive.h"
 #include "common/fs.h"
 #include "common/stream.h"
 
+#include "zvision/core/search_manager.h"
+#include "zvision/utility/zfs_archive.h"
+
 namespace ZVision {
 
 SearchManager::SearchManager(const Common::String &rootPath, int depth) {
diff --git a/engines/zvision/module.mk b/engines/zvision/module.mk
index 5efd6d4..607a9be 100644
--- a/engines/zvision/module.mk
+++ b/engines/zvision/module.mk
@@ -3,7 +3,6 @@ MODULE := engines/zvision
 MODULE_OBJS := \
 	animation/meta_animation.o \
 	animation/rlf_animation.o \
-	archives/zfs_archive.o \
 	core/console.o \
 	core/events.o \
 	core/menu.o \
@@ -48,6 +47,7 @@ MODULE_OBJS := \
 	utility/clock.o \
 	utility/lzss_read_stream.o \
 	utility/utility.o \
+	utility/zfs_archive.o \
 	video/video.o \
 	video/zork_avi_decoder.o \
 	zvision.o
diff --git a/engines/zvision/utility/zfs_archive.cpp b/engines/zvision/utility/zfs_archive.cpp
new file mode 100644
index 0000000..13b0168
--- /dev/null
+++ b/engines/zvision/utility/zfs_archive.cpp
@@ -0,0 +1,154 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/scummsys.h"
+#include "common/memstream.h"
+#include "common/debug.h"
+#include "common/file.h"
+
+#include "zvision/utility/zfs_archive.h"
+
+namespace ZVision {
+
+ZfsArchive::ZfsArchive(const Common::String &fileName) : _fileName(fileName) {
+	Common::File zfsFile;
+
+	if (!zfsFile.open(_fileName)) {
+		warning("ZFSArchive::ZFSArchive(): Could not find the archive file");
+		return;
+	}
+
+	readHeaders(&zfsFile);
+
+	debug(1, "ZfsArchive::ZfsArchive(%s): Located %d files", _fileName.c_str(), _entryHeaders.size());
+}
+
+ZfsArchive::ZfsArchive(const Common::String &fileName, Common::SeekableReadStream *stream) : _fileName(fileName) {
+	readHeaders(stream);
+
+	debug(1, "ZfsArchive::ZfsArchive(%s): Located %d files", _fileName.c_str(), _entryHeaders.size());
+}
+
+ZfsArchive::~ZfsArchive() {
+	debug(1, "ZfsArchive Destructor Called");
+	ZfsEntryHeaderMap::iterator it = _entryHeaders.begin();
+	for (; it != _entryHeaders.end(); ++it) {
+		delete it->_value;
+	}
+}
+
+void ZfsArchive::readHeaders(Common::SeekableReadStream *stream) {
+	// Don't do a straight struct cast since we can't guarantee endianness
+	_header.magic = stream->readUint32LE();
+	_header.unknown1 = stream->readUint32LE();
+	_header.maxNameLength = stream->readUint32LE();
+	_header.filesPerBlock = stream->readUint32LE();
+	_header.fileCount = stream->readUint32LE();
+	_header.xorKey[0] = stream->readByte();
+	_header.xorKey[1] = stream->readByte();
+	_header.xorKey[2] = stream->readByte();
+	_header.xorKey[3] = stream->readByte();
+	_header.fileSectionOffset = stream->readUint32LE();
+
+	uint32 nextOffset;
+
+	do {
+		// Read the offset to the next block
+		nextOffset = stream->readUint32LE();
+
+		// Read in each entry header
+		for (uint32 i = 0; i < _header.filesPerBlock; ++i) {
+			ZfsEntryHeader entryHeader;
+
+			entryHeader.name = readEntryName(stream);
+			entryHeader.offset = stream->readUint32LE();
+			entryHeader.id = stream->readUint32LE();
+			entryHeader.size = stream->readUint32LE();
+			entryHeader.time = stream->readUint32LE();
+			entryHeader.unknown = stream->readUint32LE();
+
+			if (entryHeader.size != 0)
+				_entryHeaders[entryHeader.name] = new ZfsEntryHeader(entryHeader);
+		}
+
+		// Seek to the next block of headers
+		stream->seek(nextOffset);
+	} while (nextOffset != 0);
+}
+
+Common::String ZfsArchive::readEntryName(Common::SeekableReadStream *stream) const {
+	// Entry Names are at most 16 bytes and are null padded
+	char buffer[16];
+	stream->read(buffer, 16);
+
+	return Common::String(buffer);
+}
+
+bool ZfsArchive::hasFile(const Common::String &name) const {
+	return _entryHeaders.contains(name);
+}
+
+int ZfsArchive::listMembers(Common::ArchiveMemberList &list) const {
+	int matches = 0;
+
+	for (ZfsEntryHeaderMap::const_iterator it = _entryHeaders.begin(); it != _entryHeaders.end(); ++it) {
+		list.push_back(Common::ArchiveMemberList::value_type(new Common::GenericArchiveMember(it->_value->name, this)));
+		matches++;
+	}
+
+	return matches;
+}
+
+const Common::ArchiveMemberPtr ZfsArchive::getMember(const Common::String &name) const {
+	if (!_entryHeaders.contains(name))
+		return Common::ArchiveMemberPtr();
+
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
+Common::SeekableReadStream *ZfsArchive::createReadStreamForMember(const Common::String &name) const {
+	if (!_entryHeaders.contains(name)) {
+		return 0;
+	}
+
+	ZfsEntryHeader *entryHeader = _entryHeaders[name];
+
+	Common::File zfsArchive;
+	zfsArchive.open(_fileName);
+	zfsArchive.seek(entryHeader->offset);
+
+	// This *HAS* to be malloc (not new[]) because MemoryReadStream uses free() to free the memory
+	byte *buffer = (byte *)malloc(entryHeader->size);
+	zfsArchive.read(buffer, entryHeader->size);
+	// Decrypt the data in place
+	if (_header.xorKey != 0)
+		unXor(buffer, entryHeader->size, _header.xorKey);
+
+	return new Common::MemoryReadStream(buffer, entryHeader->size, DisposeAfterUse::YES);
+}
+
+void ZfsArchive::unXor(byte *buffer, uint32 length, const byte *xorKey) const {
+	for (uint32 i = 0; i < length; ++i)
+		buffer[i] ^= xorKey[i % 4];
+}
+
+} // End of namespace ZVision
diff --git a/engines/zvision/utility/zfs_archive.h b/engines/zvision/utility/zfs_archive.h
new file mode 100644
index 0000000..571591a
--- /dev/null
+++ b/engines/zvision/utility/zfs_archive.h
@@ -0,0 +1,125 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef ZVISION_ZFS_ARCHIVE_H
+#define ZVISION_ZFS_ARCHIVE_H
+
+#include "common/archive.h"
+#include "common/hashmap.h"
+#include "common/hash-str.h"
+
+namespace Common {
+class String;
+}
+
+namespace ZVision {
+
+struct ZfsHeader {
+	uint32 magic;
+	uint32 unknown1;
+	uint32 maxNameLength;
+	uint32 filesPerBlock;
+	uint32 fileCount;
+	byte xorKey[4];
+	uint32 fileSectionOffset;
+};
+
+struct ZfsEntryHeader {
+	Common::String name;
+	uint32 offset;
+	uint32 id;
+	uint32 size;
+	uint32 time;
+	uint32 unknown;
+};
+
+typedef Common::HashMap<Common::String, ZfsEntryHeader *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ZfsEntryHeaderMap;
+
+class ZfsArchive : public Common::Archive {
+public:
+	ZfsArchive(const Common::String &fileName);
+	ZfsArchive(const Common::String &fileName, Common::SeekableReadStream *stream);
+	~ZfsArchive();
+
+	/**
+	 * Check if a member with the given name is present in the Archive.
+	 * Patterns are not allowed, as this is meant to be a quick File::exists()
+	 * replacement.
+	 */
+	bool hasFile(const Common::String &fileName) const;
+
+	/**
+	 * Add all members of the Archive to list.
+	 * Must only append to list, and not remove elements from it.
+	 *
+	 * @return    The number of names added to list
+	 */
+	int listMembers(Common::ArchiveMemberList &list) const;
+
+	/**
+	 * Returns a ArchiveMember representation of the given file.
+	 */
+	const Common::ArchiveMemberPtr getMember(const Common::String &name) const;
+
+	/**
+	 * Create a stream bound to a member with the specified name in the
+	 * archive. If no member with this name exists, 0 is returned.
+	 *
+	 * @return    The newly created input stream
+	 */
+	Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const;
+
+private:
+	const Common::String _fileName;
+	ZfsHeader _header;
+	ZfsEntryHeaderMap _entryHeaders;
+
+	/**
+	 * Parses the zfs file into file entry headers that can be used later
+	 * to get the entry data.
+	 *
+	 * @param stream    The contents of the zfs file
+	 */
+	void readHeaders(Common::SeekableReadStream *stream);
+
+	/**
+	 * Entry names are contained within a 16 byte block. This reads the block
+	 * and converts it the name to a Common::String
+	 *
+	 * @param stream    The zfs file stream
+	 * @return          The entry file name
+	 */
+	Common::String readEntryName(Common::SeekableReadStream *stream) const;
+
+	/**
+	 * ZFS file entries can be encrypted using XOR encoding. This method
+	 * decodes the buffer in place using the supplied xorKey.
+	 *
+	 * @param buffer    The data to decode
+	 * @param length    Length of buffer
+	 */
+	void unXor(byte *buffer, uint32 length, const byte *xorKey) const;
+};
+
+} // End of namespace ZVision
+
+#endif
diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp
index 7a5e50f..d981d14 100644
--- a/engines/zvision/zvision.cpp
+++ b/engines/zvision/zvision.cpp
@@ -23,20 +23,19 @@
 #include "common/scummsys.h"
 
 #include "zvision/zvision.h"
-
 #include "zvision/core/console.h"
 #include "zvision/scripting/script_manager.h"
 #include "zvision/graphics/render_manager.h"
 #include "zvision/cursors/cursor_manager.h"
 #include "zvision/core/save_manager.h"
 #include "zvision/text/string_manager.h"
-#include "zvision/archives/zfs_archive.h"
 #include "zvision/detection.h"
 #include "zvision/core/menu.h"
 #include "zvision/core/search_manager.h"
 #include "zvision/text/text.h"
 #include "zvision/fonts/truetype_font.h"
 #include "zvision/core/midi.h"
+#include "zvision/utility/zfs_archive.h"
 
 #include "common/config-manager.h"
 #include "common/str.h"






More information about the Scummvm-git-logs mailing list