[Scummvm-cvs-logs] SF.net SVN: scummvm:[34777] scummvm/trunk/engines/parallaction

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Sun Oct 12 09:01:10 CEST 2008


Revision: 34777
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34777&view=rev
Author:   peres001
Date:     2008-10-12 07:01:09 +0000 (Sun, 12 Oct 2008)

Log Message:
-----------
Changed BRA to use the new Common:Archive infrastructure.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/disk.h
    scummvm/trunk/engines/parallaction/disk_br.cpp
    scummvm/trunk/engines/parallaction/parallaction_br.cpp

Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h	2008-10-12 06:06:04 UTC (rev 34776)
+++ scummvm/trunk/engines/parallaction/disk.h	2008-10-12 07:01:09 UTC (rev 34777)
@@ -28,6 +28,7 @@
 
 #define PATH_LEN 200
 
+#include "common/archive.h"
 #include "common/fs.h"
 #include "common/file.h"
 
@@ -54,6 +55,8 @@
 	Disk() { }
 	virtual ~Disk() { }
 
+	virtual void init() { }
+
 	virtual Common::String selectArchive(const Common::String &name) = 0;
 	virtual void setLanguage(uint16 language) = 0;
 
@@ -201,31 +204,31 @@
 };
 
 
+class Disk_br : public Disk {
+	Common::SeekableReadStream *openFile_internal(bool errorOnNotFound, const Common::String &name, const Common::String &ext);
+protected:
+	Common::SearchSet	_sset;
+
+	Common::SeekableReadStream *tryOpenFile(const Common::String &name, const Common::String &ext = Common::String::emptyString);
+	Common::SeekableReadStream *openFile(const Common::String &name, const Common::String &ext = Common::String::emptyString);
+	void errorFileNotFound(const Common::String &filename);
+};
+
 //	for the moment DosDisk_br subclasses Disk. When Amiga support will
 //  be taken into consideration, it might be useful to add another level
 //  like we did for Nippon Safes.
-class DosDisk_br : public Disk {
+class DosDisk_br : public Disk_br {
 
 protected:
 	uint16			_language;
 
 	Parallaction	*_vm;
 
-	Common::FSNode	_baseDir;
-	Common::FSNode	_partDir;
+	Common::SharedPtr<Common::FSDirectory> _baseDir;
+	Common::String		_currentPart;
 
-	Common::FSNode	_aniDir;
-	Common::FSNode	_bkgDir;
-	Common::FSNode	_mscDir;
-	Common::FSNode	_mskDir;
-	Common::FSNode	_pthDir;
-	Common::FSNode	_rasDir;
-	Common::FSNode	_scrDir;
-	Common::FSNode	_sfxDir;
-	Common::FSNode	_talDir;
 
 protected:
-	void errorFileNotFound(const Common::FSNode &dir, const Common::String &filename);
 	Font *createFont(const char *name, Common::ReadStream &stream);
 	Sprites*	createSprites(Common::ReadStream &stream);
 	void loadBitmap(Common::SeekableReadStream &stream, Graphics::Surface &surf, byte *palette);
@@ -235,6 +238,8 @@
 	DosDisk_br(Parallaction *vm);
 	virtual ~DosDisk_br();
 
+	virtual void init();
+
 	Common::String selectArchive(const Common::String &name);
 	void setLanguage(uint16 language);
 	Script* loadLocation(const char *name);
@@ -254,38 +259,34 @@
 	void loadMask(const char *name, MaskBuffer &buffer);
 };
 
-class DosDemo_br : public DosDisk_br {
+class DosDemoDisk_br : public DosDisk_br {
 
 public:
-	DosDemo_br(Parallaction *vm);
-	virtual ~DosDemo_br();
+	DosDemoDisk_br(Parallaction *vm);
+	virtual ~DosDemoDisk_br();
 
+	virtual void init();
+
 	Common::String selectArchive(const Common::String& name);
-
 };
 
 class AmigaDisk_br : public DosDisk_br {
 
 protected:
+	Common::SharedPtr<Common::FSDirectory> _baseDir;
+	Common::String		_currentPart;
+
 	BackgroundInfo	_backgroundTemp;
 
 	Sprites*	createSprites(Common::ReadStream &stream);
 	Font *createFont(const char *name, Common::SeekableReadStream &stream);
 	void loadBackground(BackgroundInfo& info, Common::SeekableReadStream &stream);
-
-	Common::FSNode	_baseBkgDir;
-	Common::FSNode	_fntDir;
-	Common::FSNode	_commonAniDir;
-	Common::FSNode	_commonBkgDir;
-	Common::FSNode	_commonMscDir;
-	Common::FSNode	_commonMskDir;
-	Common::FSNode	_commonPthDir;
-	Common::FSNode	_commonTalDir;
-
 public:
 	AmigaDisk_br(Parallaction *vm);
 	virtual ~AmigaDisk_br();
 
+	virtual void init();
+
 	GfxObj* loadTalk(const char *name);
 	Font* loadFont(const char* name);
 	GfxObj* loadStatic(const char* name);

Modified: scummvm/trunk/engines/parallaction/disk_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_br.cpp	2008-10-12 06:06:04 UTC (rev 34776)
+++ scummvm/trunk/engines/parallaction/disk_br.cpp	2008-10-12 07:01:09 UTC (rev 34777)
@@ -89,32 +89,49 @@
 
 };
 
+Common::SeekableReadStream *Disk_br::openFile_internal(bool errorOnNotFound, const Common::String &name, const Common::String &ext) {
+	assert(!name.empty());
+	debugC(5, kDebugDisk, "Disk_br::openFile(%s, %s)", name.c_str(), ext.c_str());
 
+	Common::String lookup(name);
 
-void DosDisk_br::errorFileNotFound(const Common::FSNode &dir, const Common::String &filename) {
-	error("File '%s' not found in directory '%s'", filename.c_str(), dir.getDisplayName().c_str());
+	if (!ext.empty() && !name.hasSuffix(ext.c_str())) {
+		// make sure we are using the specified extension
+		debugC(9, kDebugDisk, "Disk_br::openFile: appending explicit extension (%s) to (%s)", ext.c_str(), name.c_str());
+		lookup = name + ext;
+	}
+
+	Common::SeekableReadStream *stream = _sset.openFile(lookup);
+	if (!stream && errorOnNotFound) {
+		errorFileNotFound(lookup);
+	}
+	return stream;
 }
 
+Common::SeekableReadStream *Disk_br::openFile(const Common::String &name, const Common::String &ext) {
+	return openFile_internal(true, name, ext);
+}
+
+Common::SeekableReadStream *Disk_br::tryOpenFile(const Common::String &name, const Common::String &ext) {
+	return openFile_internal(false, name, ext);
+}
+
+
+void Disk_br::errorFileNotFound(const Common::String &filename) {
+	error("File '%s' not found", filename.c_str());
+}
+
 Common::String DosDisk_br::selectArchive(const Common::String& name) {
 	debugC(5, kDebugDisk, "DosDisk_br::selectArchive");
 
-	Common::String oldPath;
-	if (_partDir.exists()) {
-		oldPath = _partDir.getDisplayName();
-	}
+	Common::String oldPath = _currentPart;
+	_currentPart = name;
 
-	_partDir = _baseDir.getChild(name);
+	debugC(5, kDebugDisk, "DosDisk_br::selectArchive: adding part directory to search set");
+	_sset.remove("part");
+	Common::SharedPtr<Common::FSDirectory> partDir(_baseDir->getSubDirectory(name, 3));
+	_sset.add("part", partDir, 10);
 
-	_aniDir = _partDir.getChild("ani");
-	_bkgDir = _partDir.getChild("bkg");
-	_mscDir = _partDir.getChild("msc");
-	_mskDir = _partDir.getChild("msk");
-	_pthDir = _partDir.getChild("pth");
-	_rasDir = _partDir.getChild("ras");
-	_scrDir = _partDir.getChild("scripts");
-	_sfxDir = _partDir.getChild("sfx");
-	_talDir = _partDir.getChild("tal");
-
 	return oldPath;
 }
 
@@ -124,72 +141,57 @@
 	_language = language;
 }
 
-DosDisk_br::DosDisk_br(Parallaction* vm) : _vm(vm), _baseDir(ConfMan.get("path")) {
+DosDisk_br::DosDisk_br(Parallaction* vm) : _vm(vm) {
 }
 
+
+void DosDisk_br::init() {
+	// TODO: clarify whether the engine or OSystem should add the base game directory to the search manager.
+	// Right now, I am keeping an internal search set to do the job.
+	_baseDir = Common::SharedPtr<Common::FSDirectory>(new Common::FSDirectory(ConfMan.get("path")));
+	_sset.add("base", _baseDir, 5);
+}
+
+
 DosDisk_br::~DosDisk_br() {
+	_sset.clear();
 }
 
 GfxObj* DosDisk_br::loadTalk(const char *name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadTalk(%s)", name);
 
-	Common::String path(name);
-	Common::FSNode node = _talDir.getChild(path);
-	if (!node.exists()) {
-		path += ".tal";
-		node = _talDir.getChild(path);
-		if (!node.exists())
-			errorFileNotFound(_talDir, path);
-	}
+	Common::SeekableReadStream *stream = openFile("tal/" + Common::String(name), ".tal");
 
-	Common::File stream;
-	stream.open(node);
-
 	// talk position is set to (0,0), because talks are always displayed at
 	// absolute coordinates, set in the dialogue manager. The original used
 	// to null out coordinates every time they were needed. We do it better!
-	Sprites *spr = createSprites(stream);
+	Sprites *spr = createSprites(*stream);
 	for (int i = 0; i < spr->getNum(); i++) {
 		spr->_sprites[i].x = 0;
 		spr->_sprites[i].y = 0;
 	}
+
+	delete stream;
 	return new GfxObj(0, spr, name);
 }
 
 Script* DosDisk_br::loadLocation(const char *name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadLocation");
 
-	Common::String langs[4] = { "it", "fr", "en", "ge" };
-	Common::FSNode locDir = _partDir.getChild(langs[_language]);
+	static const Common::String langs[4] = { "it/", "fr/", "en/", "ge/" };
 
-	Common::String path(name);
-	path += ".slf";
-	Common::FSNode node = locDir.getChild(path);
-	if (!node.exists()) {
-		path = Common::String(name) + ".loc";
-		node = locDir.getChild(path);
-		if (!node.exists()) {
-			errorFileNotFound(locDir, path);
-		}
+	Common::String fullName(name);
+	if (!fullName.hasSuffix(".slf")) {
+		fullName += ".loc";
 	}
 
-	Common::File *stream = new Common::File;
-	stream->open(node);
+	Common::SeekableReadStream *stream = openFile(langs[_language] + fullName);
 	return new Script(stream, true);
 }
 
 Script* DosDisk_br::loadScript(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadScript");
-
-	Common::String path(name);
-	path += ".scr";
-	Common::FSNode node = _scrDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_scrDir, path);
-	}
-
-	Common::File *stream = new Common::File;
-	stream->open(node);
+	Common::SeekableReadStream *stream = openFile("scripts/" + Common::String(name), ".scr");
 	return new Script(stream, true);
 }
 
@@ -218,52 +220,29 @@
 
 Frames* DosDisk_br::loadPointer(const char *name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadPointer");
-
-	Common::String path(name);
-	path += ".ras";
-	Common::FSNode node = _baseDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_baseDir, path);
-	}
-
-	Common::File stream;
-	stream.open(node);
-
+	Common::SeekableReadStream *stream = openFile(Common::String(name), ".ras");
 	Graphics::Surface *surf = new Graphics::Surface;
-	loadBitmap(stream, *surf, 0);
+	loadBitmap(*stream, *surf, 0);
+	delete stream;
 	return new SurfaceToFrames(surf);
 }
 
 
 Font* DosDisk_br::loadFont(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadFont");
-
-	Common::String path(name);
-	path += ".fnt";
-	Common::FSNode node = _baseDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_baseDir, path);
-	}
-
-	Common::File stream;
-	stream.open(node);
-	return createFont(name, stream);
+	Common::SeekableReadStream *stream = openFile(name, ".fnt");
+	Font *font = createFont(name, *stream);
+	delete stream;
+	return font;
 }
 
 
 GfxObj* DosDisk_br::loadObjects(const char *name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadObjects");
-
-	Common::String path(name);
-	Common::FSNode node = _partDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_partDir, path);
-	}
-
-	Common::File stream;
-	stream.open(node);
-
-	return createInventoryObjects(stream);
+	Common::SeekableReadStream *stream = openFile(name);
+	GfxObj *obj = createInventoryObjects(*stream);
+	delete stream;
+	return obj;
 }
 
 void genSlidePath(char *path, const char* name) {
@@ -272,18 +251,10 @@
 
 GfxObj* DosDisk_br::loadStatic(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadStatic");
-
-	Common::String path(name);
-	Common::FSNode node = _rasDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_rasDir, path);
-	}
-
-	Common::File stream;
-	stream.open(node);
-
+	Common::SeekableReadStream *stream = openFile("ras/" + Common::String(name), ".ras");
 	Graphics::Surface *surf = new Graphics::Surface;
-	loadBitmap(stream, *surf, 0);
+	loadBitmap(*stream, *surf, 0);
+	delete stream;
 	return new GfxObj(0, new SurfaceToFrames(surf), name);
 }
 
@@ -310,20 +281,10 @@
 
 Frames* DosDisk_br::loadFrames(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
-
-	Common::String path(name);
-	Common::FSNode node = _aniDir.getChild(path);
-	if (!node.exists()) {
-		path += ".ani";
-		node = _aniDir.getChild(path);
-		if (!node.exists()) {
-			errorFileNotFound(_aniDir, path);
-		}
-	}
-
-	Common::File stream;
-	stream.open(node);
-	return createSprites(stream);
+	Common::SeekableReadStream *stream = openFile("ani/" + Common::String(name), ".ani");
+	Frames *frames = createSprites(*stream);
+	delete stream;
+	return frames;
 }
 
 // Slides in Nippon Safes are basically screen-sized pictures with valid
@@ -334,27 +295,19 @@
 void DosDisk_br::loadSlide(BackgroundInfo& info, const char *name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadSlide");
 
-	Common::String path(name);
-	path += ".bmp";
-	Common::FSNode node = _baseDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_baseDir, path);
-	}
+	Common::SeekableReadStream *stream = openFile(name, ".bmp");
 
-	Common::File stream;
-	stream.open(node);
-
 	byte rgb[768];
 
-	loadBitmap(stream, info.bg, rgb);
+	loadBitmap(*stream, info.bg, rgb);
 	info.width = info.bg.w;
 	info.height = info.bg.h;
 
+	delete stream;
+
 	for (uint i = 0; i < 256; i++) {
 		info.palette.setEntry(i, rgb[i] >> 2, rgb[i+256] >> 2, rgb[i+512] >> 2);
 	}
-
-	return;
 }
 
 void DosDisk_br::loadMask(const char *name, MaskBuffer &buffer) {
@@ -362,42 +315,25 @@
 		return;
 	}
 
-	Common::String filepath;
-	Common::FSNode node;
-	Common::File stream;
+	Common::SeekableReadStream *stream = openFile("msk/" + Common::String(name), ".msk");
 
-	filepath = Common::String(name) + ".msk";
-	node = _mskDir.getChild(filepath);
-	if (!node.exists()) {
-		errorFileNotFound(_mskDir, filepath);
-	}
-	stream.open(node);
-
 	// NOTE: info.width and info.height are only valid if the background graphics
 	// have already been loaded
 	buffer.bigEndian = false;
-	stream.read(buffer.data, buffer.size);
-	stream.close();
+	stream->read(buffer.data, buffer.size);
+	delete stream;
 }
 
 void DosDisk_br::loadScenery(BackgroundInfo& info, const char *name, const char *mask, const char* path) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadScenery");
 
-	Common::String filepath;
-	Common::FSNode node;
-	Common::File stream;
+	Common::SeekableReadStream *stream;
 
 	if (name) {
-		filepath = Common::String(name) + ".bkg";
-		node = _bkgDir.getChild(filepath);
-		if (!node.exists()) {
-			errorFileNotFound(_bkgDir, filepath);
-		}
-		stream.open(node);
-
+		stream = openFile("bkg/" + Common::String(name), ".bkg");
 		byte rgb[768];
 
-		loadBitmap(stream, info.bg, rgb);
+		loadBitmap(*stream, info.bg, rgb);
 		info.width = info.bg.w;
 		info.height = info.bg.h;
 
@@ -405,38 +341,22 @@
 			info.palette.setEntry(i, rgb[i] >> 2, rgb[i+256] >> 2, rgb[i+512] >> 2);
 		}
 
-		stream.close();
+		delete stream;
 	}
 
 	if (mask) {
-		filepath = Common::String(mask) + ".msk";
-		node = _mskDir.getChild(filepath);
-		if (!node.exists()) {
-			errorFileNotFound(_mskDir, filepath);
-		}
-		stream.open(node);
-
-		// NOTE: info.width and info.height are only valid if the background graphics
-		// have already been loaded
 		info.mask.create(info.width, info.height);
-		info.mask.bigEndian = false;
-		stream.read(info.mask.data, info.mask.size);
-		stream.close();
+		loadMask(mask, info.mask);
 	}
 
 	if (path) {
-		filepath = Common::String(path) + ".pth";
-		node = _pthDir.getChild(filepath);
-		if (!node.exists()) {
-			errorFileNotFound(_pthDir, filepath);
-		}
-		stream.open(node);
+		stream = openFile("pth/" + Common::String(path), ".pth");
 
 		// NOTE: info.width and info.height are only valid if the background graphics
 		// have already been loaded
 		info.path.create(info.width, info.height);
-		stream.read(info.path.data, info.path.size);
-		stream.close();
+		stream->read(info.path.data, info.path.size);
+		delete stream;
 	}
 
 	return;
@@ -444,19 +364,9 @@
 
 Table* DosDisk_br::loadTable(const char* name) {
 	debugC(5, kDebugDisk, "DosDisk_br::loadTable");
-
-	Common::String path(name);
-	path += ".tab";
-	Common::FSNode node = _partDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_partDir, path);
-	}
-
-	Common::File stream;
-	stream.open(node);
-	Table *t = createTableFromStream(100, stream);
-	stream.close();
-
+	Common::SeekableReadStream *stream = openFile(name, ".tab");
+	Table *t = createTableFromStream(100, *stream);
+	delete stream;
 	return t;
 }
 
@@ -474,62 +384,47 @@
 
 
 
+DosDemoDisk_br::DosDemoDisk_br(Parallaction *vm) : DosDisk_br(vm) {
 
+}
 
-DosDemo_br::DosDemo_br(Parallaction *vm) : DosDisk_br(vm) {
-
+void DosDemoDisk_br::init() {
+	// TODO: clarify whether the engine or OSystem should add the base game directory to the search manager.
+	// Right now, I am keeping an internal search set to do the job.
+	_baseDir = Common::SharedPtr<Common::FSDirectory>(new Common::FSDirectory(ConfMan.get("path"), 2));
+	_sset.add("base", _baseDir, 5);
 }
 
 
-DosDemo_br::~DosDemo_br() {
+DosDemoDisk_br::~DosDemoDisk_br() {
 
 }
 
-Common::String DosDemo_br::selectArchive(const Common::String& name) {
-	debugC(5, kDebugDisk, "DosDemo_br::selectArchive");
-
-	Common::String oldPath;
-	if (_partDir.exists()) {
-		oldPath = _partDir.getDisplayName();
-	}
-
-	_partDir = _baseDir;
-
-	_aniDir = _partDir.getChild("ani");
-	_bkgDir = _partDir.getChild("bkg");
-	_mscDir = _partDir.getChild("msc");
-	_mskDir = _partDir.getChild("msk");
-	_pthDir = _partDir.getChild("pth");
-	_rasDir = _partDir.getChild("ras");
-	_scrDir = _partDir.getChild("scripts");
-	_sfxDir = _partDir.getChild("sfx");
-	_talDir = _partDir.getChild("tal");
-
+Common::String DosDemoDisk_br::selectArchive(const Common::String& name) {
+	debugC(5, kDebugDisk, "DosDemoDisk_br::selectArchive");
+	Common::String oldPath = _currentPart;
+	_currentPart = name;
 	return oldPath;
 }
 
 
-
-
-
-
 AmigaDisk_br::AmigaDisk_br(Parallaction *vm) : DosDisk_br(vm) {
-	_fntDir = _baseDir.getChild("fonts");
+}
 
-	_baseBkgDir = _baseDir.getChild("backs");
+void AmigaDisk_br::init() {
+	_baseDir = Common::SharedPtr<Common::FSDirectory>(new Common::FSDirectory(ConfMan.get("path")));
+	_sset.add("base", _baseDir, 5);
 
-	Common::FSNode commonDir = _baseDir.getChild("common");
-	_commonAniDir = commonDir.getChild("anims");
-	_commonBkgDir = commonDir.getChild("backs");
-	_commonMscDir = commonDir.getChild("msc");
-	_commonMskDir = commonDir.getChild("msk");
-	_commonPthDir = commonDir.getChild("pth");
-	_commonTalDir = commonDir.getChild("talks");
+	const Common::String subDirNames[3] = { "fonts", "backs", "common" };
+	const Common::String subDirPrefixes[3] = { "fonts", "backs", Common::String::emptyString };
+	for (int i = 0; i < 3; i++) {
+		Common::SharedPtr<Common::Archive> subDir(_baseDir->getSubDirectory(subDirPrefixes[i], subDirNames[i], 2));
+		_sset.add(subDirNames[i], subDir, 6);
+	}
 }
 
-
 AmigaDisk_br::~AmigaDisk_br() {
-
+	_sset.clear();
 }
 
 
@@ -565,23 +460,12 @@
 void AmigaDisk_br::loadScenery(BackgroundInfo& info, const char* name, const char* mask, const char* path) {
 	debugC(1, kDebugDisk, "AmigaDisk_br::loadScenery '%s', '%s' '%s'", name, mask, path);
 
-	Common::String filepath;
-	Common::FSNode node;
-	Common::File stream;
+	Common::SeekableReadStream *stream;
 
 	if (name) {
-		filepath = Common::String(name) + ".bkg";
-		node = _bkgDir.getChild(filepath);
-		if (!node.exists()) {
-			filepath = Common::String(name) + ".bkg";
-			node = _commonBkgDir.getChild(filepath);
-			if (!node.exists()) {
-				errorFileNotFound(_bkgDir, filepath);
-			}
-		}
-		stream.open(node);
-		loadBackground(info, stream);
-		stream.close();
+		stream = openFile("backs/" + Common::String(name), ".bkg");
+		loadBackground(info, *stream);
+		delete stream;
 	}
 #if 0
 	if (mask && _mskDir.exists()) {
@@ -604,22 +488,17 @@
 		}
 	}
 #endif
-	if (path && _pthDir.exists()) {
-		filepath = Common::String(path) + ".pth";
-		node = _pthDir.getChild(filepath);
-		if (!node.exists()) {
-			filepath = Common::String(path) + ".pth";
-			node = _commonPthDir.getChild(filepath);
-			if (!node.exists()) {
-				errorFileNotFound(_pthDir, filepath);
-			}
+	if (path) {
+		stream = tryOpenFile("pth/" + Common::String(path), ".pth");
+		if (stream) {
+			// NOTE: info.width and info.height are only valid if the background graphics
+			// have already been loaded
+			info.path.create(info.width, info.height);
+			stream->read(info.path.data, info.path.size);
+			delete stream;
+		} else {
+			debugC(1, kDebugDisk, "AmigaDisk_br::loadScenery: (%s) not found", path);
 		}
-		stream.open(node);
-		// NOTE: info.width and info.height are only valid if the background graphics
-		// have already been loaded
-		info.path.create(info.width, info.height);
-		stream.read(info.path.data, info.path.size);
-		stream.close();
 	}
 
 	return;
@@ -628,36 +507,24 @@
 void AmigaDisk_br::loadSlide(BackgroundInfo& info, const char *name) {
 	debugC(1, kDebugDisk, "AmigaDisk_br::loadSlide '%s'", name);
 
-	Common::String path(name);
-	path += ".bkg";
-	Common::FSNode node = _baseBkgDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_baseBkgDir, path);
-	}
-	Common::File stream;
-	stream.open(node);
-	loadBackground(info, stream);
-	return;
+	Common::SeekableReadStream *stream = openFile("backs/" + Common::String(name), ".bkg");
+	loadBackground(info, *stream);
+	delete stream;
 }
 
 GfxObj* AmigaDisk_br::loadStatic(const char* name) {
 	debugC(1, kDebugDisk, "AmigaDisk_br::loadStatic '%s'", name);
 
-	Common::String path(name);
-	Common::FSNode node = _rasDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_rasDir, path);
-	}
-	Common::File stream;
-	stream.open(node);
+	Common::SeekableReadStream *stream = openFile("ras/" + Common::String(name), ".ras");
 
 	byte *pal = 0;
 	Graphics::Surface* surf = new Graphics::Surface;
 
-	Graphics::ILBMDecoder decoder(stream, *surf, pal);
+	Graphics::ILBMDecoder decoder(*stream, *surf, pal);
 	decoder.decode();
 
 	free(pal);
+	delete stream;
 
 	return new GfxObj(0, new SurfaceToFrames(surf));
 }
@@ -685,138 +552,64 @@
 
 Frames* AmigaDisk_br::loadFrames(const char* name) {
 	debugC(1, kDebugDisk, "AmigaDisk_br::loadFrames '%s'", name);
-
-	Common::String path(name);
-	Common::FSNode node = _aniDir.getChild(path);
-	if (!node.exists()) {
-		path += ".ani";
-		node = _aniDir.getChild(path);
-		if (!node.exists()) {
-			path = Common::String(name);
-			node = _commonAniDir.getChild(path);
-			if (!node.exists()) {
-				path += ".ani";
-				node = _commonAniDir.getChild(path);
-				if (!node.exists()) {
-					errorFileNotFound(_aniDir, path);
-				}
-			}
-		}
-	}
-
-	Common::File stream;
-	stream.open(node);
-	return createSprites(stream);
+	Common::SeekableReadStream *stream = openFile("anims/" + Common::String(name), ".ani");
+	Frames *frames = createSprites(*stream);
+	delete stream;
+	return frames;
 }
 
 GfxObj* AmigaDisk_br::loadTalk(const char *name) {
 	debugC(1, kDebugDisk, "AmigaDisk_br::loadTalk '%s'", name);
-
-	Common::String path(name);
-	Common::FSNode node = _talDir.getChild(path);
-	if (!node.exists()) {
-		path += ".tal";
-		node = _talDir.getChild(path);
-		if (!node.exists()) {
-			path = Common::String(name);
-			node = _commonTalDir.getChild(path);
-			if (!node.exists()) {
-				path += ".tal";
-				node = _commonTalDir.getChild(path);
-				if (!node.exists()) {
-					errorFileNotFound(_talDir, path);
-				}
-			}
-		}
-	}
-
-	Common::File stream;
-	stream.open(node);
-	return new GfxObj(0, createSprites(stream));
+	Common::SeekableReadStream *stream = openFile("talks/" + Common::String(name), ".tal");
+	GfxObj* obj = new GfxObj(0, createSprites(*stream));
+	delete stream;
+	return obj;
 }
 
 Font* AmigaDisk_br::loadFont(const char* name) {
 	debugC(1, kDebugDisk, "AmigaFullDisk::loadFont '%s'", name);
 
-	Common::String path(name);
-	path += ".font";
-	Common::FSNode node = _fntDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_fntDir, path);
-	}
+	Common::SeekableReadStream *stream = openFile("fonts/" + Common::String(name), ".font");
 
 	Common::String fontDir;
 	Common::String fontFile;
 	byte ch;
 
-	Common::File stream;
-	stream.open(node);
-	stream.seek(4, SEEK_SET);
-	while ((ch = stream.readByte()) != 0x2F) fontDir += ch;
-	while ((ch = stream.readByte()) != 0) fontFile += ch;
-	stream.close();
+	stream->seek(4, SEEK_SET);
+	while ((ch = stream->readByte()) != 0x2F) fontDir += ch;
+	while ((ch = stream->readByte()) != 0) fontFile += ch;
+	delete stream;
 
-	node = _fntDir.getChild(fontDir);
-	if (!node.exists()) {
-		errorFileNotFound(_fntDir, fontDir);
-	}
-	node = node.getChild(fontFile);
-	if (!node.exists()) {
-		errorFileNotFound(node, fontFile);
-	}
+	stream = openFile("fonts/" + fontDir + "/" + fontFile);
+	Font *font = createFont(name, *stream);
 
-	stream.open(node);
-	return createFont(name, stream);
+	delete stream;
+	return font;
 }
 
 Common::SeekableReadStream* AmigaDisk_br::loadMusic(const char* name) {
 	debugC(5, kDebugDisk, "AmigaDisk_br::loadMusic");
-
-	Common::String path(name);
-	Common::FSNode node = _mscDir.getChild(path);
-	if (!node.exists()) {
-		// TODO (Kirben): error out when music file is not found?
-		return 0;
-	}
-
-	Common::File *stream = new Common::File;
-	stream->open(node);
-	return stream;
+	return openFile("msc/" + Common::String(name), ".msc");
 }
 
 
 Common::ReadStream* AmigaDisk_br::loadSound(const char* name) {
 	debugC(5, kDebugDisk, "AmigaDisk_br::loadSound");
-
-	Common::String path(name);
-	Common::FSNode node = _sfxDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_sfxDir, path);
-	}
-
-	Common::File *stream = new Common::File;
-	stream->open(node);
-	return stream;
+	return openFile("sfx/" + Common::String(name), ".sfx");
 }
 
 GfxObj* AmigaDisk_br::loadObjects(const char *name) {
 	debugC(5, kDebugDisk, "AmigaDisk_br::loadObjects");
 
-	Common::String path(name);
-	Common::FSNode node = _partDir.getChild(path);
-	if (!node.exists()) {
-		errorFileNotFound(_partDir, path);
-	}
+	Common::SeekableReadStream *stream = openFile(name);
 
-	Common::File stream;
-	stream.open(node);
-
 	byte *pal = 0;
 	Graphics::Surface* surf = new Graphics::Surface;
 
-	Graphics::ILBMDecoder decoder(stream, *surf, pal);
+	Graphics::ILBMDecoder decoder(*stream, *surf, pal);
 	decoder.decode();
 
+	delete stream;
 	free(pal);
 
 	return new GfxObj(0, new SurfaceToFrames(surf));
@@ -825,24 +618,16 @@
 Common::String AmigaDisk_br::selectArchive(const Common::String& name) {
 	debugC(5, kDebugDisk, "AmigaDisk_br::selectArchive");
 
-	Common::String oldPath;
-	if (_partDir.exists()) {
-		oldPath = _partDir.getDisplayName();
-	}
+	Common::String oldPath = _currentPart;
+	_currentPart = name;
 
-	_partDir = _baseDir.getChild(name);
+	debugC(5, kDebugDisk, "AmigaDisk_br::selectArchive: adding part directory to search set");
+	_sset.remove("part");
+	Common::SharedPtr<Common::FSDirectory> partDir(_baseDir->getSubDirectory(name, 3));
+	_sset.add("part", partDir, 10);
 
-	_aniDir = _partDir.getChild("anims");
-	_bkgDir = _partDir.getChild("backs");
-	_mscDir = _partDir.getChild("msc");
-	_mskDir = _partDir.getChild("msk");
-	_pthDir = _partDir.getChild("pth");
-	_rasDir = _partDir.getChild("ras");
-	_scrDir = _partDir.getChild("scripts");
-	_sfxDir = _partDir.getChild("sfx");
-	_talDir = _partDir.getChild("talks");
-
 	return oldPath;
 }
 
+
 } // namespace Parallaction

Modified: scummvm/trunk/engines/parallaction/parallaction_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/parallaction_br.cpp	2008-10-12 06:06:04 UTC (rev 34776)
+++ scummvm/trunk/engines/parallaction/parallaction_br.cpp	2008-10-12 07:01:09 UTC (rev 34777)
@@ -50,7 +50,7 @@
 	if (getGameType() == GType_BRA) {
 		if (getPlatform() == Common::kPlatformPC) {
 			if (getFeatures() & GF_DEMO) {
-				_disk = new DosDemo_br(this);
+				_disk = new DosDemoDisk_br(this);
 			} else {
 				_disk = new DosDisk_br(this);
 			}
@@ -61,6 +61,8 @@
 			_disk->setLanguage(2);					// NOTE: language is now hardcoded to English. Original used command-line parameters.
 			_soundMan = new AmigaSoundMan(this);
 		}
+
+		_disk->init();
 	} else {
 		error("unknown game type");
 	}
@@ -236,7 +238,7 @@
 			_char._objs = _disk->loadObjects("icons.ico");
 		}
 
-		parseLocation("common");
+		parseLocation("common.slf");
 	}
 
 	freeLocation();


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