aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/parallaction/callables_ns.cpp1
-rw-r--r--engines/parallaction/disk.h43
-rw-r--r--engines/parallaction/disk_ns.cpp142
-rw-r--r--engines/parallaction/gui_ns.cpp4
-rw-r--r--engines/parallaction/parallaction.cpp2
-rw-r--r--engines/parallaction/parallaction_ns.cpp11
6 files changed, 95 insertions, 108 deletions
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp
index 7915daa0b8..45dd597104 100644
--- a/engines/parallaction/callables_ns.cpp
+++ b/engines/parallaction/callables_ns.cpp
@@ -371,7 +371,6 @@ void Parallaction_ns::_c_testResult(void *parm) {
_gfx->freeLabels();
_gfx->updateScreen();
- _disk->selectArchive("disk1");
parseLocation("common");
uint id[2];
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h
index 20cb03f025..108c5fe886 100644
--- a/engines/parallaction/disk.h
+++ b/engines/parallaction/disk.h
@@ -77,48 +77,23 @@ public:
virtual void loadMask(const char *name, MaskBuffer &buffer) { }
};
-
-
-
-#define MAX_ARCHIVE_ENTRIES 384
-
-class NSArchive : public Common::Archive {
-
- Common::SeekableReadStream *_stream;
-
- char _archiveDir[MAX_ARCHIVE_ENTRIES][32];
- uint32 _archiveLenghts[MAX_ARCHIVE_ENTRIES];
- uint32 _archiveOffsets[MAX_ARCHIVE_ENTRIES];
- uint32 _numFiles;
-
- uint32 lookup(const char *name);
-
-public:
- NSArchive(Common::SeekableReadStream *stream, Common::Platform platform, uint32 features);
- ~NSArchive();
-
- Common::SeekableReadStream *openFile(const Common::String &name);
- bool hasFile(const Common::String &name);
- int listMembers(Common::ArchiveMemberList &list);
- Common::ArchiveMemberPtr getMember(const Common::String &name);
-};
+class NSArchive;
class Disk_ns : public Disk {
protected:
Parallaction *_vm;
- NSArchive *_resArchive;
- NSArchive *_locArchive;
+ Common::SearchSet _sset;
Common::String _resArchiveName;
Common::String _language;
Common::SeekableReadStream *openFile(const char *filename);
- Common::SeekableReadStream *tryOpenFile(const char *filename);
- virtual Common::SeekableReadStream *tryOpenExternalFile(const char *filename);
- virtual Common::SeekableReadStream *tryOpenArchivedFile(const char* name) { return 0; }
+ virtual Common::SeekableReadStream *tryOpenFile(const char *filename) { return 0; }
void errorFileNotFound(const char *filename);
+ void addArchive(const Common::String& name, int priority);
+
public:
Disk_ns(Parallaction *vm);
virtual ~Disk_ns();
@@ -141,12 +116,14 @@ private:
protected:
Gfx *_gfx;
- virtual Common::SeekableReadStream *tryOpenArchivedFile(const char* name);
+ virtual Common::SeekableReadStream *tryOpenFile(const char* name);
public:
DosDisk_ns(Parallaction *vm);
virtual ~DosDisk_ns();
+ void init();
+
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
GfxObj* loadTalk(const char *name);
@@ -170,7 +147,7 @@ protected:
void patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height);
void unpackFrame(byte *dst, byte *src, uint16 planeSize);
void unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height);
- Common::SeekableReadStream *tryOpenArchivedFile(const char* name);
+ Common::SeekableReadStream *tryOpenFile(const char* name);
Font *createFont(const char *name, Common::SeekableReadStream &stream);
void loadMask(BackgroundInfo& info, const char *name);
void loadPath(BackgroundInfo& info, const char *name);
@@ -180,6 +157,8 @@ public:
AmigaDisk_ns(Parallaction *vm);
virtual ~AmigaDisk_ns();
+ void init();
+
Script* loadLocation(const char *name);
Script* loadScript(const char* name);
GfxObj* loadTalk(const char *name);
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index 80e8a9da6d..bd6c151cf1 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -24,6 +24,7 @@
*/
#include "graphics/iff.h"
+#include "common/config-manager.h"
#include "parallaction/parallaction.h"
@@ -60,6 +61,30 @@ namespace Parallaction {
#define NORMAL_ARCHIVE_DATA_OFS 0x4000
#define SMALL_ARCHIVE_DATA_OFS 0x1966
+#define MAX_ARCHIVE_ENTRIES 384
+
+class NSArchive : public Common::Archive {
+
+ Common::SeekableReadStream *_stream;
+
+ char _archiveDir[MAX_ARCHIVE_ENTRIES][32];
+ uint32 _archiveLenghts[MAX_ARCHIVE_ENTRIES];
+ uint32 _archiveOffsets[MAX_ARCHIVE_ENTRIES];
+ uint32 _numFiles;
+
+ uint32 lookup(const char *name);
+
+public:
+ NSArchive(Common::SeekableReadStream *stream, Common::Platform platform, uint32 features);
+ ~NSArchive();
+
+ Common::SeekableReadStream *openFile(const Common::String &name);
+ bool hasFile(const Common::String &name);
+ int listMembers(Common::ArchiveMemberList &list);
+ Common::ArchiveMemberPtr getMember(const Common::String &name);
+};
+
+
NSArchive::NSArchive(Common::SeekableReadStream *stream, Common::Platform platform, uint32 features) : _stream(stream) {
if (!_stream) {
error("NSArchive: invalid stream passed to constructor");
@@ -143,16 +168,18 @@ Common::ArchiveMemberPtr NSArchive::getMember(const Common::String &name) {
}
+#define HIGHEST_PRIORITY 9
+#define NORMAL_ARCHIVE_PRIORITY 5
+#define LOW_ARCHIVE_PRIORITY 2
+#define LOWEST_ARCHIVE_PRIORITY 1
-
-Disk_ns::Disk_ns(Parallaction *vm) : _vm(vm), _language("ur") {
- _locArchive = 0;
- _resArchive = 0;
+Disk_ns::Disk_ns(Parallaction *vm) : _vm(vm) {
+ Common::FSDirectory *baseDir = new Common::FSDirectory(ConfMan.get("path"));
+ _sset.add("basedir", baseDir, HIGHEST_PRIORITY);
}
Disk_ns::~Disk_ns() {
- delete _resArchive;
- delete _locArchive;
+ _sset.clear();
}
void Disk_ns::errorFileNotFound(const char *s) {
@@ -166,33 +193,31 @@ Common::SeekableReadStream *Disk_ns::openFile(const char *filename) {
return stream;
}
-Common::SeekableReadStream *Disk_ns::tryOpenFile(const char *filename) {
- Common::SeekableReadStream *stream = tryOpenExternalFile(filename);
- if (stream)
- return stream;
- return tryOpenArchivedFile(filename);
-}
-Common::SeekableReadStream *Disk_ns::tryOpenExternalFile(const char *filename) {
- assert(filename);
- Common::File *stream = new Common::File;
- if (!stream->open(filename)) {
- delete stream;
- stream = 0;
- }
- return stream;
+void Disk_ns::addArchive(const Common::String& name, int priority) {
+ Common::SeekableReadStream *stream = _sset.openFile(name);
+ if (!stream)
+ error("Disk_ns::addArchive() couldn't find archive '%s'", name.c_str());
+
+ debugC(1, kDebugDisk, "Disk_ns::addArchive(name = %s, priority = %i)", name.c_str(), priority);
+
+ NSArchive *arc = new NSArchive(stream, _vm->getPlatform(), _vm->getFeatures());
+ _sset.add(name, arc, priority);
}
Common::String Disk_ns::selectArchive(const Common::String& name) {
- if (name.compareToIgnoreCase(_resArchiveName) == 0) {
- return _resArchiveName;
+ Common::String oldName = _resArchiveName;
+
+ if (_sset.hasArchive(name)) {
+ return oldName;
}
- debugC(1, kDebugDisk, "Disk_ns::selectArchive(%s)", name.c_str());
+ if (!_resArchiveName.empty()) {
+ _sset.remove(_resArchiveName);
+ }
+ _resArchiveName = name;
+ addArchive(name, LOW_ARCHIVE_PRIORITY);
- Common::String oldName = _resArchiveName;
- delete _resArchive;
- _resArchive = new NSArchive(tryOpenExternalFile(name.c_str()), _vm->getPlatform(), _vm->getFeatures());
return oldName;
}
@@ -200,21 +225,23 @@ void Disk_ns::setLanguage(uint16 language) {
debugC(1, kDebugDisk, "setLanguage(%i)", language);
assert(language < 4);
+ if (!_language.empty()) {
+ _sset.remove(_language);
+ }
+
static const char *languages[] = { "it", "fr", "en", "ge" };
+ _language = languages[language];
- if (_language.compareToIgnoreCase(languages[language]) == 0) {
+ if (_sset.hasArchive(_language)) {
return;
}
- _language = languages[language];
- delete _locArchive;
- _locArchive = new NSArchive(tryOpenExternalFile(_language.c_str()), _vm->getPlatform(), _vm->getFeatures());
+ addArchive(_language, LOWEST_ARCHIVE_PRIORITY);
}
#pragma mark -
-
DosDisk_ns::DosDisk_ns(Parallaction* vm) : Disk_ns(vm) {
}
@@ -222,27 +249,21 @@ DosDisk_ns::DosDisk_ns(Parallaction* vm) : Disk_ns(vm) {
DosDisk_ns::~DosDisk_ns() {
}
+void DosDisk_ns::init() {
+ // setup permament archives
+ addArchive("disk1", NORMAL_ARCHIVE_PRIORITY);
+}
-Common::SeekableReadStream *DosDisk_ns::tryOpenArchivedFile(const char* name) {
- debugC(3, kDebugDisk, "DosDisk_ns::openArchivedFile(%s)", name);
-
- NSArchive *arc = 0;
-
- Common::String filename(name);
- if (filename.hasSuffix(".loc")) {
- arc = _locArchive;
- } else {
- arc = _resArchive;
- }
+Common::SeekableReadStream *DosDisk_ns::tryOpenFile(const char* name) {
+ debugC(3, kDebugDisk, "DosDisk_ns::tryOpenFile(%s)", name);
- Common::SeekableReadStream *stream = arc->openFile(name);
- if (stream) {
+ Common::SeekableReadStream *stream = _sset.openFile(name);
+ if (stream)
return stream;
- }
char path[PATH_LEN];
sprintf(path, "%s.pp", name);
- return arc->openFile(path);
+ return _sset.openFile(path);
}
@@ -685,6 +706,16 @@ AmigaDisk_ns::~AmigaDisk_ns() {
}
+void AmigaDisk_ns::init() {
+ // setup permament archives
+ if (_vm->getFeatures() & GF_DEMO) {
+ addArchive("disk0", NORMAL_ARCHIVE_PRIORITY);
+ } else {
+ addArchive("disk0", NORMAL_ARCHIVE_PRIORITY);
+ addArchive("disk1", NORMAL_ARCHIVE_PRIORITY);
+ }
+}
+
#define NUM_PLANES 5
/*
@@ -854,30 +885,21 @@ GfxObj* AmigaDisk_ns::loadStatic(const char* name) {
return new GfxObj(0, makeCnv(s, true), name);
}
-Common::SeekableReadStream *AmigaDisk_ns::tryOpenArchivedFile(const char* name) {
- debugC(3, kDebugDisk, "AmigaDisk_ns::openArchivedFile(%s)", name);
-
- NSArchive *arc = 0;
-
- Common::String filename(name);
- if (filename.hasSuffix(".loc")) {
- arc = _locArchive;
- } else {
- arc = _resArchive;
- }
+Common::SeekableReadStream *AmigaDisk_ns::tryOpenFile(const char* name) {
+ debugC(3, kDebugDisk, "AmigaDisk_ns::tryOpenFile(%s)", name);
- Common::SeekableReadStream *stream = arc->openFile(name);
+ Common::SeekableReadStream *stream = _sset.openFile(name);
if (stream)
return stream;
char path[PATH_LEN];
sprintf(path, "%s.pp", name);
- stream = arc->openFile(path);
+ stream = _sset.openFile(path);
if (stream)
return new PowerPackerStream(*stream);
sprintf(path, "%s.dd", name);
- stream = arc->openFile(path);
+ stream = _sset.openFile(path);
if (stream)
return new PowerPackerStream(*stream);
diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp
index 73cc1be12e..9ea11fa200 100644
--- a/engines/parallaction/gui_ns.cpp
+++ b/engines/parallaction/gui_ns.cpp
@@ -319,7 +319,6 @@ public:
}
virtual void enter() {
- _vm->_disk->selectArchive("disk1");
_vm->setBackground("test", NULL, NULL);
_vm->_input->setMouseState(MOUSE_ENABLED_HIDE);
@@ -544,7 +543,6 @@ public:
virtual void enter() {
_vm->_soundMan->stopMusic();
- _vm->_disk->selectArchive((_vm->getFeatures() & GF_DEMO) ? "disk0" : "disk1");
_vm->showSlide("password");
_emptySlots.create(BLOCK_WIDTH * 8, BLOCK_HEIGHT, 1);
@@ -798,8 +796,6 @@ const char *EndPartInputState_NS::endMsg6[] = {"DELL' AVVENTURA", "DE L'AVENTURE
const char *EndPartInputState_NS::endMsg7[] = {"ED ORA IL GRAN FINALE ", "ET MAINTENANT LE GRAND FINAL", "NOW THE GREAT FINAL", "UND YETZT DER GROSSE SCHLUSS!"};
void Parallaction_ns::startGui() {
- _disk->selectArchive((getFeatures() & GF_DEMO) ? "disk0" : "disk1");
-
_menuHelper = new MenuInputHelper;
assert(_menuHelper);
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index 5abc308bee..4810c4af67 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -66,8 +66,6 @@ Parallaction::Parallaction(OSystem *syst, const PARALLACTIONGameDescription *gam
// FIXME
_vm = this;
- Common::File::addDefaultDirectory(_gameDataDir);
-
Common::addSpecialDebugLevel(kDebugDialogue, "dialogue", "Dialogues debug level");
Common::addSpecialDebugLevel(kDebugParser, "parser", "Parser debug level");
Common::addSpecialDebugLevel(kDebugDisk, "disk", "Disk debug level");
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index efb5f94b84..90820a6f8f 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -155,9 +155,10 @@ Common::Error Parallaction_ns::init() {
strcpy(_location._name, "fognedemo");
}
_disk = new AmigaDisk_ns(this);
- _disk->selectArchive((getFeatures() & GF_DEMO) ? "disk0" : "disk1");
}
+ _disk->init();
+
if (getPlatform() == Common::kPlatformPC) {
int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI);
MidiDriver *driver = MidiDriver::createMidi(midiDriver);
@@ -394,16 +395,11 @@ void Parallaction_ns::changeCharacter(const char *name) {
// character for sanity before memory is freed
freeCharacter();
- Common::String oldArchive = _disk->selectArchive((getFeatures() & GF_DEMO) ? "disk0" : "disk1");
_char._ani->gfxobj = _gfx->loadAnim(_char.getFullName());
_char._ani->gfxobj->setFlags(kGfxObjCharacter);
_char._ani->gfxobj->clearFlags(kGfxObjNormal);
if (!_char.dummy()) {
- if (getPlatform() == Common::kPlatformAmiga) {
- _disk->selectArchive("disk0");
- }
-
_char._head = _disk->loadHead(_char.getBaseName());
_char._talk = _disk->loadTalk(_char.getBaseName());
_char._objs = _disk->loadObjects(_char.getBaseName());
@@ -420,9 +416,6 @@ void Parallaction_ns::changeCharacter(const char *name) {
parseLocation("common");
}
- if (!oldArchive.empty())
- _disk->selectArchive(oldArchive);
-
strcpy(_characterName1, _char.getFullName());
debugC(3, kDebugExec, "changeCharacter: switch completed");