aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMatthew Hoops2010-05-11 15:41:31 +0000
committerMatthew Hoops2010-05-11 15:41:31 +0000
commit1c0ffdc42df5cbb81a15e403bfaea2c800dca89f (patch)
tree06f1df945febb4bccad07ab56aae36a9bf763b2e /engines
parent59476e44b9d72349fb094a665759729bef1c95b2 (diff)
downloadscummvm-rg350-1c0ffdc42df5cbb81a15e403bfaea2c800dca89f.tar.gz
scummvm-rg350-1c0ffdc42df5cbb81a15e403bfaea2c800dca89f.tar.bz2
scummvm-rg350-1c0ffdc42df5cbb81a15e403bfaea2c800dca89f.zip
Add support for loading T7G Mac resources using the MacResManager.
svn-id: r49005
Diffstat (limited to 'engines')
-rw-r--r--engines/groovie/cursor.cpp34
-rw-r--r--engines/groovie/cursor.h10
-rw-r--r--engines/groovie/detection.cpp4
-rw-r--r--engines/groovie/groovie.cpp24
-rw-r--r--engines/groovie/groovie.h6
-rw-r--r--engines/groovie/resource.cpp60
-rw-r--r--engines/groovie/resource.h9
-rw-r--r--engines/groovie/script.cpp23
8 files changed, 113 insertions, 57 deletions
diff --git a/engines/groovie/cursor.cpp b/engines/groovie/cursor.cpp
index 5812585a0c..3f304c7859 100644
--- a/engines/groovie/cursor.cpp
+++ b/engines/groovie/cursor.cpp
@@ -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 @@ static const uint16 cursorDataOffsets[NUM_IMGS] = {
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 @@ GrvCursorMan_t7g::GrvCursorMan_t7g(OSystem *system) :
_cursors.push_back(s);
}
- robgjd.close();
+ delete robgjd;
}
GrvCursorMan_t7g::~GrvCursorMan_t7g() {
@@ -179,7 +187,7 @@ GrvCursorMan_t7g::~GrvCursorMan_t7g() {
}
}
-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 @@ byte *GrvCursorMan_t7g::loadImage(Common::File &file) {
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();
diff --git a/engines/groovie/cursor.h b/engines/groovie/cursor.h
index 6df7860e23..83aebb37d3 100644
--- a/engines/groovie/cursor.h
+++ b/engines/groovie/cursor.h
@@ -30,6 +30,10 @@
#include "common/array.h"
#include "common/file.h"
+namespace Common {
+ class MacResManager;
+}
+
namespace Groovie {
class Cursor {
@@ -70,7 +74,7 @@ protected:
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 @@ private:
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 {
diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp
index c2776b1049..5b0fa4b3b1 100644
--- a/engines/groovie/detection.cpp
+++ b/engines/groovie/detection.cpp
@@ -63,8 +63,8 @@ static const GroovieGameDescription gameDescriptions[] = {
{
{
"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
},
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp
index 3b83b880d5..ba18b37690 100644
--- a/engines/groovie/groovie.cpp
+++ b/engines/groovie/groovie.cpp
@@ -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 @@ namespace Groovie {
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 @@ GroovieEngine::~GroovieEngine() {
delete _musicPlayer;
delete _graphicsMan;
delete _script;
+ delete _macResFork;
}
Common::Error GroovieEngine::run() {
@@ -104,8 +106,14 @@ Common::Error GroovieEngine::run() {
// 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 @@ Common::Error GroovieEngine::run() {
}
// 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::Error GroovieEngine::run() {
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;
diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h
index 51159f7fc2..dae2df0595 100644
--- a/engines/groovie/groovie.h
+++ b/engines/groovie/groovie.h
@@ -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 @@ public:
MusicPlayer *_musicPlayer;
GraphicsMan *_graphicsMan;
+ Common::MacResManager *_macResFork;
+
private:
const GroovieGameDescription *_gameDescription;
Debugger *_debugger;
diff --git a/engines/groovie/resource.cpp b/engines/groovie/resource.cpp
index 866095eb78..10195f8c8a 100644
--- a/engines/groovie/resource.cpp
+++ b/engines/groovie/resource.cpp
@@ -23,6 +23,9 @@
*
*/
+#include "common/archive.h"
+#include "common/macresman.h"
+
#include "groovie/groovie.h"
#include "groovie/resource.h"
@@ -73,7 +76,7 @@ Common::SeekableReadStream *ResMan::open(uint32 fileRef) {
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 @@ uint16 ResMan_t7g::getRef(Common::String name, Common::String scriptname) {
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 @@ uint16 ResMan_t7g::getRef(Common::String name, Common::String scriptname) {
}
// 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 @@ bool ResMan_t7g::getResInfo(uint32 fileRef, ResInfo &resInfo) {
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;
}
diff --git a/engines/groovie/resource.h b/engines/groovie/resource.h
index 405de538a9..ca2ea177cb 100644
--- a/engines/groovie/resource.h
+++ b/engines/groovie/resource.h
@@ -26,6 +26,10 @@
#ifndef GROOVIE_RESOURCE_H
#define GROOVIE_RESOURCE_H
+namespace Common {
+ class MacResManager;
+}
+
namespace Groovie {
struct ResInfo {
@@ -50,11 +54,14 @@ protected:
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 {
diff --git a/engines/groovie/script.cpp b/engines/groovie/script.cpp
index c7c7f21738..15a0a473c0 100644
--- a/engines/groovie/script.cpp
+++ b/engines/groovie/script.cpp
@@ -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 @@ void Script::timerTick() {
}
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")) {