mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 05:38:56 +00:00
* completed transition to Common::Archive for Nippon Safes.
* removed lots of old Archive swap magic svn-id: r34931
This commit is contained in:
parent
71d7b5762a
commit
e6337d11aa
@ -371,7 +371,6 @@ void Parallaction_ns::_c_testResult(void *parm) {
|
||||
_gfx->freeLabels();
|
||||
_gfx->updateScreen();
|
||||
|
||||
_disk->selectArchive("disk1");
|
||||
parseLocation("common");
|
||||
|
||||
uint id[2];
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
static const char *languages[] = { "it", "fr", "en", "ge" };
|
||||
if (!_language.empty()) {
|
||||
_sset.remove(_language);
|
||||
}
|
||||
|
||||
if (_language.compareToIgnoreCase(languages[language]) == 0) {
|
||||
static const char *languages[] = { "it", "fr", "en", "ge" };
|
||||
_language = languages[language];
|
||||
|
||||
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);
|
||||
Common::SeekableReadStream *DosDisk_ns::tryOpenFile(const char* name) {
|
||||
debugC(3, kDebugDisk, "DosDisk_ns::tryOpenFile(%s)", name);
|
||||
|
||||
NSArchive *arc = 0;
|
||||
|
||||
Common::String filename(name);
|
||||
if (filename.hasSuffix(".loc")) {
|
||||
arc = _locArchive;
|
||||
} else {
|
||||
arc = _resArchive;
|
||||
}
|
||||
|
||||
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);
|
||||
Common::SeekableReadStream *AmigaDisk_ns::tryOpenFile(const char* name) {
|
||||
debugC(3, kDebugDisk, "AmigaDisk_ns::tryOpenFile(%s)", name);
|
||||
|
||||
NSArchive *arc = 0;
|
||||
|
||||
Common::String filename(name);
|
||||
if (filename.hasSuffix(".loc")) {
|
||||
arc = _locArchive;
|
||||
} else {
|
||||
arc = _resArchive;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user