- added a new archive member variable to Disk, to decouple resource archives from location archives

- made Script use a stream as input with overall simplification of Disk routines

svn-id: r26379
This commit is contained in:
Nicola Mettifogo 2007-04-03 22:03:21 +00:00
parent 4c151928fa
commit e3c25e6d20
4 changed files with 97 additions and 123 deletions

View File

@ -116,6 +116,47 @@ public:
};
/*
This stream class is just a wrapper around Archive, so
deallocation is not a problem. In fact, this class doesn't
delete its input (Archive) stream.
*/
class DummyArchiveStream : public Common::SeekableReadStream {
Archive *_input;
public:
DummyArchiveStream(Archive &input) : _input(&input) {
}
~DummyArchiveStream() {
// this class exists to provide this empty destructor
}
bool eos() const {
return _input->eos();
}
uint32 read(void* data, uint32 dataSize) {
return _input->read(data, dataSize);
}
uint32 pos() const {
return _input->pos();
}
uint32 size() const {
return _input->size();
}
void seek(int32 offset, int whence) {
_input->seek(offset, whence);
}
};
Disk::Disk(Parallaction *vm) : _vm(vm) {
@ -131,7 +172,7 @@ void Disk::errorFileNotFound(const char *s) {
void Disk::selectArchive(const char *name) {
_archive.open(name);
_resArchive.open(name);
}
void Disk::setLanguage(uint16 language) {
@ -158,6 +199,10 @@ void Disk::setLanguage(uint16 language) {
}
_languageDir[2] = '\0';
_locArchive.open(_languageDir);
_languageDir[2] = '/';
return;
}
@ -230,20 +275,20 @@ Cnv* DosDisk::loadCnv(const char *filename) {
char path[PATH_LEN];
strcpy(path, filename);
if (!_archive.openArchivedFile(path)) {
if (!_resArchive.openArchivedFile(path)) {
sprintf(path, "%s.pp", filename);
if (!_archive.openArchivedFile(path))
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(path);
}
uint16 numFrames = _archive.readByte();
uint16 width = _archive.readByte();
uint16 height = _archive.readByte();
uint16 numFrames = _resArchive.readByte();
uint16 width = _resArchive.readByte();
uint16 height = _resArchive.readByte();
uint32 decsize = numFrames * width * height;
byte *data = (byte*)malloc(decsize);
RLEStream decoder(&_archive);
RLEStream decoder(&_resArchive);
decoder.read(data, decsize);
return new Cnv(numFrames, width, height, data);
@ -289,23 +334,13 @@ Script* DosDisk::loadLocation(const char *name) {
strcat(archivefile, name);
strcat(archivefile, ".loc");
_languageDir[2] = '\0';
_archive.open(_languageDir);
_languageDir[2] = '/';
if (!_archive.openArchivedFile(archivefile)) {
if (!_locArchive.openArchivedFile(archivefile)) {
sprintf(archivefile, "%s%s.loc", _languageDir, name);
if (!_archive.openArchivedFile(archivefile))
if (!_locArchive.openArchivedFile(archivefile))
errorFileNotFound(name);
}
uint32 size = _archive.size();
char *buf = (char*)malloc(size+1);
_archive.read(buf, size);
buf[size] = '\0';
return new Script(buf, true);
return new Script(new DummyArchiveStream(_locArchive), true);
}
Script* DosDisk::loadScript(const char* name) {
@ -314,15 +349,10 @@ Script* DosDisk::loadScript(const char* name) {
sprintf(vC8, "%s.script", name);
if (!_archive.openArchivedFile(vC8))
if (!_resArchive.openArchivedFile(vC8))
errorFileNotFound(vC8);
uint32 size = _archive.size();
char *buf = (char*)malloc(size+1);
_archive.read(buf, size);
buf[size] = '\0';
return new Script(buf, true);
return new Script(new DummyArchiveStream(_resArchive), true);
}
StaticCnv* DosDisk::loadHead(const char* name) {
@ -369,22 +399,22 @@ StaticCnv* DosDisk::loadStatic(const char* name) {
char path[PATH_LEN];
strcpy(path, name);
if (!_archive.openArchivedFile(path)) {
if (!_resArchive.openArchivedFile(path)) {
sprintf(path, "%s.pp", name);
if (!_archive.openArchivedFile(path))
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(path);
}
StaticCnv* cnv = new StaticCnv;
_archive.skip(1);
cnv->_width = _archive.readByte();
cnv->_height = _archive.readByte();
_resArchive.skip(1);
cnv->_width = _resArchive.readByte();
cnv->_height = _resArchive.readByte();
uint16 size = cnv->_width*cnv->_height;
cnv->_data0 = (byte*)malloc(size);
RLEStream decoder(&_archive);
RLEStream decoder(&_resArchive);
decoder.read(cnv->_data0, size);
return cnv;
@ -447,17 +477,17 @@ void DosDisk::parseBackground(Common::SeekableReadStream &stream) {
void DosDisk::loadBackground(const char *filename) {
if (!_archive.openArchivedFile(filename))
if (!_resArchive.openArchivedFile(filename))
errorFileNotFound(filename);
parseBackground(_archive);
parseBackground(_resArchive);
byte *bg = (byte*)calloc(1, SCREEN_WIDTH*SCREEN_HEIGHT);
byte *mask = (byte*)calloc(1, SCREENMASK_WIDTH*SCREEN_HEIGHT);
byte *path = (byte*)calloc(1, SCREENPATH_WIDTH*SCREEN_HEIGHT);
RLEStream stream(&_archive);
RLEStream stream(&_resArchive);
unpackBackground(&stream, bg, mask, path);
_vm->_gfx->setBackground(bg);
@ -481,16 +511,16 @@ void DosDisk::loadMaskAndPath(const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.msk", name);
if (!_archive.openArchivedFile(path))
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(name);
byte *maskBuf = (byte*)calloc(1, SCREENMASK_WIDTH*SCREEN_HEIGHT);
byte *pathBuf = (byte*)calloc(1, SCREENPATH_WIDTH*SCREEN_HEIGHT);
parseDepths(_archive);
parseDepths(_resArchive);
_archive.read(pathBuf, SCREENPATH_WIDTH*SCREEN_HEIGHT);
_archive.read(maskBuf, SCREENMASK_WIDTH*SCREEN_HEIGHT);
_resArchive.read(pathBuf, SCREENPATH_WIDTH*SCREEN_HEIGHT);
_resArchive.read(maskBuf, SCREENMASK_WIDTH*SCREEN_HEIGHT);
_vm->_gfx->setMask(maskBuf);
setPath(pathBuf);
@ -702,45 +732,6 @@ public:
/*
This stream class is just a wrapper around Archive, so
deallocation is not a problem. In fact, this class doesn't
delete its input (Archive) stream.
*/
class DummyArchiveStream : public Common::SeekableReadStream {
Archive *_input;
public:
DummyArchiveStream(Archive &input) : _input(&input) {
}
~DummyArchiveStream() {
// this class exists to provide this empty destructor
}
bool eos() const {
return _input->eos();
}
uint32 read(void* data, uint32 dataSize) {
return _input->read(data, dataSize);
}
uint32 pos() const {
return _input->pos();
}
uint32 size() const {
return _input->size();
}
void seek(int32 offset, int whence) {
_input->seek(offset, whence);
}
};
@ -842,27 +833,16 @@ Cnv* AmigaDisk::makeCnv(Common::SeekableReadStream &stream) {
Script* AmigaDisk::loadLocation(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk::loadLocation '%s'", name);
_languageDir[2] = '\0';
_archive.open(_languageDir);
_languageDir[2] = '/';
char path[PATH_LEN];
sprintf(path, "%s%s%s.loc.pp", _vm->_characterName, _languageDir, name);
if (!_archive.openArchivedFile(path)) {
if (!_locArchive.openArchivedFile(path)) {
sprintf(path, "%s%s.loc.pp", _languageDir, name);
if (!_archive.openArchivedFile(path)) {
if (!_locArchive.openArchivedFile(path)) {
errorFileNotFound(name);
}
}
PowerPackerStream stream(_archive);
uint32 size = stream.size();
char *buf = (char*)malloc(size+1);
stream.read(buf, size);
buf[size] = '\0';
return new Script(buf, true);
return new Script(new PowerPackerStream(_locArchive), true);
}
Script* AmigaDisk::loadScript(const char* name) {
@ -872,15 +852,10 @@ Script* AmigaDisk::loadScript(const char* name) {
sprintf(vC8, "%s.script", name);
if (!_archive.openArchivedFile(vC8))
if (!_resArchive.openArchivedFile(vC8))
errorFileNotFound(vC8);
uint32 size = _archive.size();
char *buf = (char*)malloc(size+1);
_archive.read(buf, size);
buf[size] = '\0';
return new Script(buf, true);
return new Script(new DummyArchiveStream(_resArchive), true);
}
Cnv* AmigaDisk::loadTalk(const char *name) {
@ -948,7 +923,7 @@ Cnv* AmigaDisk::loadFont(const char* name) {
else
strcpy(path, "introfont");
if (!_archive.openArchivedFile(path))
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(path);
// FIXME: actually read data from font file and create
@ -971,20 +946,20 @@ StaticCnv* AmigaDisk::loadStatic(const char* name) {
Common::SeekableReadStream *AmigaDisk::openArchivedFile(const char* name, bool errorOnFileNotFound) {
if (_archive.openArchivedFile(name)) {
return new DummyArchiveStream(_archive);
if (_resArchive.openArchivedFile(name)) {
return new DummyArchiveStream(_resArchive);
}
char path[PATH_LEN];
sprintf(path, "%s.pp", name);
if (_archive.openArchivedFile(path)) {
return new PowerPackerStream(_archive);
if (_resArchive.openArchivedFile(path)) {
return new PowerPackerStream(_resArchive);
}
sprintf(path, "%s.dd", name);
if (_archive.openArchivedFile(path)) {
return new PowerPackerStream(_archive);
if (_resArchive.openArchivedFile(path)) {
return new PowerPackerStream(_resArchive);
}
if (errorOnFileNotFound)
@ -1119,10 +1094,10 @@ Table* AmigaDisk::loadTable(const char* name) {
dispose = true;
stream = s;
} else {
if (!_archive.openArchivedFile(path))
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(path);
stream = &_archive;
stream = &_resArchive;
}
Table *t = new Table(100);

View File

@ -80,7 +80,8 @@ public:
class Disk {
protected:
Archive _archive;
Archive _resArchive;
Archive _locArchive;
char _languageDir[3];
Parallaction *_vm;

View File

@ -29,13 +29,12 @@ namespace Parallaction {
char _tokens[20][40];
Script::Script(const char* s, bool disposeSource) : _src(s), _disposeSource(disposeSource) {
_pos = const_cast<char*>(_src);
Script::Script(Common::SeekableReadStream *input, bool disposeSource) : _input(input), _disposeSource(disposeSource) {
}
Script::~Script() {
if (_disposeSource)
free(const_cast<char*>(_src));
delete _input;
}
char *Script::readLine(char *buf, size_t bufSize) {
@ -44,12 +43,13 @@ char *Script::readLine(char *buf, size_t bufSize) {
char v2 = 0;
for ( _si = 0; _si<bufSize; _si++) {
v2 = *_pos++;
if (v2 == 0xA || v2 == -1) break;
if (v2 != -1 && _si < bufSize) buf[_si] = v2;
v2 = _input->readSByte();
if (v2 == 0xA || _input->eos()) break;
if (!_input->eos() && _si < bufSize) buf[_si] = v2;
}
if (_si == 0 && v2 == -1)
if (_si == 0 && _input->eos())
return 0;
buf[_si] = 0xA;

View File

@ -28,7 +28,6 @@
namespace Parallaction {
void parseInit(char *s);
char *parseNextLine(char *s, uint16 count);
uint16 fillBuffers(Common::SeekableReadStream &stream, bool errorOnEOF = false);
char *parseNextToken(char *s, char *tok, uint16 count, const char *brk);
@ -37,12 +36,11 @@ extern char _tokens[][40];
class Script : public Common::SeekableReadStream {
const char* const _src;
Common::SeekableReadStream *_input;
bool _disposeSource;
char* _pos;
public:
Script(const char* s, bool _disposeSource = false);
Script(Common::SeekableReadStream *, bool _disposeSource = false);
~Script();
uint32 read(void *dataPtr, uint32 dataSize);