[Scummvm-cvs-logs] SF.net SVN: scummvm:[49005] scummvm/trunk/engines/groovie

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Tue May 11 17:41:32 CEST 2010


Revision: 49005
          http://scummvm.svn.sourceforge.net/scummvm/?rev=49005&view=rev
Author:   mthreepwood
Date:     2010-05-11 15:41:31 +0000 (Tue, 11 May 2010)

Log Message:
-----------
Add support for loading T7G Mac resources using the MacResManager.

Modified Paths:
--------------
    scummvm/trunk/engines/groovie/cursor.cpp
    scummvm/trunk/engines/groovie/cursor.h
    scummvm/trunk/engines/groovie/detection.cpp
    scummvm/trunk/engines/groovie/groovie.cpp
    scummvm/trunk/engines/groovie/groovie.h
    scummvm/trunk/engines/groovie/resource.cpp
    scummvm/trunk/engines/groovie/resource.h
    scummvm/trunk/engines/groovie/script.cpp

Modified: scummvm/trunk/engines/groovie/cursor.cpp
===================================================================
--- scummvm/trunk/engines/groovie/cursor.cpp	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/cursor.cpp	2010-05-11 15:41:31 UTC (rev 49005)
@@ -26,6 +26,8 @@
 #include "groovie/cursor.h"
 #include "groovie/groovie.h"
 
+#include "common/archive.h"
+#include "common/macresman.h"
 #include "graphics/cursorman.h"
 
 namespace Groovie {
@@ -136,26 +138,32 @@
 const uint GrvCursorMan_t7g::_cursorImg[NUM_STYLES] = {3, 5, 4, 3, 1, 0, 2, 6, 7, 8, 8};
 const uint GrvCursorMan_t7g::_cursorPal[NUM_STYLES] = {0, 0, 0, 0, 2, 0, 1, 3, 5, 4, 6};
 
-GrvCursorMan_t7g::GrvCursorMan_t7g(OSystem *system) :
+GrvCursorMan_t7g::GrvCursorMan_t7g(OSystem *system, Common::MacResManager *macResFork) :
 	GrvCursorMan(system) {
 
-	// Open the cursors file
-	Common::File robgjd;
-	if (!robgjd.open("rob.gjd")) {
-		error("Groovie::Cursor: Couldn't open rob.gjd");
-		return;
+	Common::SeekableReadStream *robgjd = 0;
+
+	if (macResFork) {
+		// Open the cursors file from the resource fork
+		robgjd = macResFork->getResource("rob.gjd");
+	} else {
+		// Open the cursors file
+		robgjd = SearchMan.createReadStreamForMember("rob.gjd");
 	}
 
+	if (!robgjd)
+		error("Groovie::Cursor: Couldn't open rob.gjd");
+
 	// Load the images
 	for (uint imgnum = 0; imgnum < NUM_IMGS; imgnum++) {
-		robgjd.seek(cursorDataOffsets[imgnum]);
-		_images.push_back(loadImage(robgjd));
+		robgjd->seek(cursorDataOffsets[imgnum]);
+		_images.push_back(loadImage(*robgjd));
 	}
 
 	// Load the palettes
-	robgjd.seek(-0x60 * NUM_PALS, SEEK_END);
+	robgjd->seek(-0x60 * NUM_PALS, SEEK_END);
 	for (uint palnum = 0; palnum < NUM_PALS; palnum++) {
-		_palettes.push_back(loadPalette(robgjd));
+		_palettes.push_back(loadPalette(*robgjd));
 	}
 
 	// Build the cursors
@@ -164,7 +172,7 @@
 		_cursors.push_back(s);
 	}
 
-	robgjd.close();
+	delete robgjd;
 }
 
 GrvCursorMan_t7g::~GrvCursorMan_t7g() {
@@ -179,7 +187,7 @@
 	}
 }
 
-byte *GrvCursorMan_t7g::loadImage(Common::File &file) {
+byte *GrvCursorMan_t7g::loadImage(Common::SeekableReadStream &file) {
 	uint16 decompbytes = 0, offset, i, length;
 	uint8 flagbyte, lengthmask = 0x0F, offsetlen, var_8;
 	byte *cursorStorage = new byte[65536];
@@ -217,7 +225,7 @@
 	return cursorStorage;
 }
 
-byte *GrvCursorMan_t7g::loadPalette(Common::File &file) {
+byte *GrvCursorMan_t7g::loadPalette(Common::SeekableReadStream &file) {
 	byte *palette = new byte[4 * 32];
 	for (uint8 colournum = 0; colournum < 32; colournum++) {
 		palette[colournum * 4 + 0] = file.readByte();

Modified: scummvm/trunk/engines/groovie/cursor.h
===================================================================
--- scummvm/trunk/engines/groovie/cursor.h	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/cursor.h	2010-05-11 15:41:31 UTC (rev 49005)
@@ -30,6 +30,10 @@
 #include "common/array.h"
 #include "common/file.h"
 
+namespace Common {
+	class MacResManager;
+}
+
 namespace Groovie {
 
 class Cursor {
@@ -70,7 +74,7 @@
 
 class GrvCursorMan_t7g : public GrvCursorMan {
 public:
-	GrvCursorMan_t7g(OSystem *system);
+	GrvCursorMan_t7g(OSystem *system, Common::MacResManager *macResFork = 0);
 	~GrvCursorMan_t7g();
 
 private:
@@ -83,8 +87,8 @@
 	Common::Array<byte *> _palettes;
 
 	// Loading functions
-	byte *loadImage(Common::File &file);
-	byte *loadPalette(Common::File &file);
+	byte *loadImage(Common::SeekableReadStream &file);
+	byte *loadPalette(Common::SeekableReadStream &file);
 };
 
 class GrvCursorMan_v2 : public GrvCursorMan {

Modified: scummvm/trunk/engines/groovie/detection.cpp
===================================================================
--- scummvm/trunk/engines/groovie/detection.cpp	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/detection.cpp	2010-05-11 15:41:31 UTC (rev 49005)
@@ -63,8 +63,8 @@
 	{
 		{
 			"t7g", "",
-			AD_ENTRY1s("script.grv", "6e30b54b1f3bc2262cdcf7961db2ae67", 17191),
-			Common::EN_ANY, Common::kPlatformMacintosh, ADGF_NO_FLAGS, Common::GUIO_NONE
+			AD_ENTRY1s("T7GMac", "a139540fa2be2247005ccf888b7231e3", 1830783),
+			Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, Common::GUIO_NONE
 		},
 		kGroovieT7G, 0
 	},

Modified: scummvm/trunk/engines/groovie/groovie.cpp
===================================================================
--- scummvm/trunk/engines/groovie/groovie.cpp	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/groovie.cpp	2010-05-11 15:41:31 UTC (rev 49005)
@@ -26,6 +26,7 @@
 #include "common/config-manager.h"
 #include "common/debug-channels.h"
 #include "common/events.h"
+#include "common/macresman.h"
 
 #include "engines/util.h"
 
@@ -42,7 +43,7 @@
 GroovieEngine::GroovieEngine(OSystem *syst, const GroovieGameDescription *gd) :
 	Engine(syst), _gameDescription(gd), _debugger(NULL), _script(NULL),
 	_resMan(NULL), _grvCursorMan(NULL), _videoPlayer(NULL), _musicPlayer(NULL),
-	_graphicsMan(NULL), _waitingForInput(false) {
+	_graphicsMan(NULL), _macResFork(NULL), _waitingForInput(false) {
 
 	// Adding the default directories
 	const Common::FSNode gameDataDir(ConfMan.get("path"));
@@ -73,6 +74,7 @@
 	delete _musicPlayer;
 	delete _graphicsMan;
 	delete _script;
+	delete _macResFork;
 }
 
 Common::Error GroovieEngine::run() {
@@ -104,8 +106,14 @@
 	// Create the resource and cursor managers and the video player
 	switch (_gameDescription->version) {
 	case kGroovieT7G:
-		_resMan = new ResMan_t7g();
-		_grvCursorMan = new GrvCursorMan_t7g(_system);
+		if (_gameDescription->desc.platform == Common::kPlatformMacintosh) {
+			_macResFork = new Common::MacResManager();
+			if (!_macResFork->open(_gameDescription->desc.filesDescriptions[0].fileName))
+				error("Could not open %s as a resource fork", _gameDescription->desc.filesDescriptions[0].fileName);
+		}
+
+		_resMan = new ResMan_t7g(_macResFork);
+		_grvCursorMan = new GrvCursorMan_t7g(_system, _macResFork);
 		_videoPlayer = new VDXPlayer(this);
 		break;
 	case kGroovieV2:
@@ -116,11 +124,10 @@
 	}
 
 	// Create the music player
-	if (_gameDescription->desc.platform == Common::kPlatformMacintosh) {
+	if (_gameDescription->desc.platform == Common::kPlatformMacintosh)
 		_musicPlayer = new MusicPlayerMac(this);
-	} else {
+	else
 		_musicPlayer = new MusicPlayerXMI(this, _gameDescription->version == kGroovieT7G ? "fat" : "sample");
-	}
 
 	// Load volume levels
 	syncSoundSettings();
@@ -129,9 +136,10 @@
 	Common::String filename = _gameDescription->desc.filesDescriptions[0].fileName;
 	if (_gameDescription->version == kGroovieT7G) {
 		// Run The 7th Guest's demo if requested
-		if (ConfMan.hasKey("demo_mode") && ConfMan.getBool("demo_mode")) {
+		if (ConfMan.hasKey("demo_mode") && ConfMan.getBool("demo_mode"))
 			filename = Common::String("demo.grv");
-		}
+		else if (_gameDescription->desc.platform == Common::kPlatformMacintosh)
+			filename = "script.grv"; // Stored inside the executable's resource fork
 	} else if (_gameDescription->version == kGroovieV2) {
 		// Open the disk index
 		Common::File disk;

Modified: scummvm/trunk/engines/groovie/groovie.h
===================================================================
--- scummvm/trunk/engines/groovie/groovie.h	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/groovie.h	2010-05-11 15:41:31 UTC (rev 49005)
@@ -36,6 +36,10 @@
 #include "groovie/resource.h"
 #include "groovie/script.h"
 
+namespace Common {
+	class MacResManager;
+}
+
 /**
  * This is the namespace of the Groovie engine.
  *
@@ -103,6 +107,8 @@
 	MusicPlayer *_musicPlayer;
 	GraphicsMan *_graphicsMan;
 
+	Common::MacResManager *_macResFork;
+
 private:
 	const GroovieGameDescription *_gameDescription;
 	Debugger *_debugger;

Modified: scummvm/trunk/engines/groovie/resource.cpp
===================================================================
--- scummvm/trunk/engines/groovie/resource.cpp	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/resource.cpp	2010-05-11 15:41:31 UTC (rev 49005)
@@ -23,6 +23,9 @@
  *
  */
 
+#include "common/archive.h"
+#include "common/macresman.h"
+
 #include "groovie/groovie.h"
 #include "groovie/resource.h"
 
@@ -73,7 +76,7 @@
 
 static const char t7g_gjds[][0x15] = {"at", "b", "ch", "d", "dr", "fh", "ga", "hdisk", "htbd", "intro", "jhek", "k", "la", "li", "mb", "mc", "mu", "n", "p", "xmi", "gamwav"};
 
-ResMan_t7g::ResMan_t7g() {
+ResMan_t7g::ResMan_t7g(Common::MacResManager *macResFork) : _macResFork(macResFork) {
 	for (int i = 0; i < 0x15; i++) {
 		// Prepare the filename
 		Common::String filename = t7g_gjds[i];
@@ -89,19 +92,25 @@
 	Common::String rlFileName(t7g_gjds[_lastGjd]);
 	rlFileName += ".rl";
 
-	// Open the RL file
-	Common::File rlFile;
-	if (!rlFile.open(rlFileName)) {
-		error("Groovie::Resource: Couldn't open %s", rlFileName.c_str());
-		return false;
+	Common::SeekableReadStream *rlFile = 0;
+
+	if (_macResFork) {
+		// Open the RL file from the resource fork
+		rlFile = _macResFork->getResource(rlFileName);
+	} else {
+		// Open the RL file
+		rlFile = SearchMan.createReadStreamForMember(rlFileName);
 	}
 
+	if (!rlFile)
+		error("Groovie::Resource: Couldn't open %s", rlFileName.c_str());
+
 	uint16 resNum;
 	bool found = false;
-	for (resNum = 0; !found && !rlFile.err() && !rlFile.eos(); resNum++) {
+	for (resNum = 0; !found && !rlFile->err() && !rlFile->eos(); resNum++) {
 		// Read the resource name
 		char readname[12];
-		rlFile.read(readname, 12);
+		rlFile->read(readname, 12);
 
 		// Test whether it's the resource we're searching
 		Common::String resname(readname, 12);
@@ -111,11 +120,11 @@
 		}
 
 		// Skip the rest of resource information
-		rlFile.read(readname, 8);
+		rlFile->read(readname, 8);
 	}
 
 	// Close the RL file
-	rlFile.close();
+	delete rlFile;
 
 	// Verify we really found the resource
 	if (!found) {
@@ -135,32 +144,37 @@
 	Common::String rlFileName(t7g_gjds[resInfo.gjd]);
 	rlFileName += ".rl";
 
-	// Open the RL file
-	Common::File rlFile;
-	if (!rlFile.open(rlFileName)) {
-		error("Groovie::Resource: Couldn't open %s", rlFileName.c_str());
-		return false;
+	Common::SeekableReadStream *rlFile = 0;
+
+	if (_macResFork) {
+		// Open the RL file from the resource fork
+		rlFile = _macResFork->getResource(rlFileName);
+	} else {
+		// Open the RL file
+		rlFile = SearchMan.createReadStreamForMember(rlFileName);
 	}
 
+	if (!rlFile)
+		error("Groovie::Resource: Couldn't open %s", rlFileName.c_str());
+
 	// Seek to the position of the desired resource
-	rlFile.seek(resNum * 20);
-	if (rlFile.eos()) {
-		rlFile.close();
+	rlFile->seek(resNum * 20);
+	if (rlFile->eos()) {
+		delete rlFile;
 		error("Groovie::Resource: Invalid resource number: 0x%04X (%s)", resNum, rlFileName.c_str());
-		return false;
 	}
 
 	// Read the resource name (just for debugging purposes)
 	char resname[12];
-	rlFile.read(resname, 12);
+	rlFile->read(resname, 12);
 	debugC(2, kGroovieDebugResource | kGroovieDebugAll, "Groovie::Resource: Resource name: %12s", resname);
 
 	// Read the resource information
-	resInfo.offset = rlFile.readUint32LE();
-	resInfo.size = rlFile.readUint32LE();
+	resInfo.offset = rlFile->readUint32LE();
+	resInfo.size = rlFile->readUint32LE();
 
 	// Close the resource RL file
-	rlFile.close();
+	delete rlFile;
 
 	return true;
 }

Modified: scummvm/trunk/engines/groovie/resource.h
===================================================================
--- scummvm/trunk/engines/groovie/resource.h	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/resource.h	2010-05-11 15:41:31 UTC (rev 49005)
@@ -26,6 +26,10 @@
 #ifndef GROOVIE_RESOURCE_H
 #define GROOVIE_RESOURCE_H
 
+namespace Common {
+	class MacResManager;
+}
+
 namespace Groovie {
 
 struct ResInfo {
@@ -50,11 +54,14 @@
 
 class ResMan_t7g : public ResMan {
 public:
-	ResMan_t7g();
+	ResMan_t7g(Common::MacResManager *macResFork = 0);
 	~ResMan_t7g() {}
 
 	uint16 getRef(Common::String name, Common::String scriptname);
 	bool getResInfo(uint32 fileRef, ResInfo &resInfo);
+
+private:
+	Common::MacResManager *_macResFork;
 };
 
 class ResMan_v2 : public ResMan {

Modified: scummvm/trunk/engines/groovie/script.cpp
===================================================================
--- scummvm/trunk/engines/groovie/script.cpp	2010-05-11 15:38:21 UTC (rev 49004)
+++ scummvm/trunk/engines/groovie/script.cpp	2010-05-11 15:41:31 UTC (rev 49005)
@@ -30,11 +30,13 @@
 #include "groovie/cell.h"
 #include "groovie/saveload.h"
 
+#include "common/archive.h"
 #include "common/config-manager.h"
 #include "common/debug-channels.h"
 #include "common/endian.h"
 #include "common/events.h"
 #include "common/EventRecorder.h"
+#include "common/macresman.h"
 
 #define NUM_OPCODES 90
 
@@ -128,22 +130,29 @@
 }
 
 bool Script::loadScript(Common::String filename) {
-	// Try to open the script file
-	Common::File scriptfile;
-	if (!scriptfile.open(filename)) {
-		return false;
+	Common::SeekableReadStream *scriptfile = 0;
+
+	if (_vm->_macResFork) {
+		// Try to open the script file from the resource fork
+		scriptfile = _vm->_macResFork->getResource(filename);
+	} else {
+		// Try to open the script file
+		scriptfile = SearchMan.createReadStreamForMember(filename);
 	}
 
+	if (!scriptfile)
+		return false;
+
 	// Save the script filename
 	_scriptFile = filename;
 
 	// Load the code
-	_codeSize = scriptfile.size();
+	_codeSize = scriptfile->size();
 	_code = new byte[_codeSize];
 	if (!_code)
 		return false;
-	scriptfile.read(_code, _codeSize);
-	scriptfile.close();
+	scriptfile->read(_code, _codeSize);
+	delete scriptfile;
 
 	// Patch the loaded code for known script bugs
 	if (filename.equals("dr.grv")) {


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