diff options
-rw-r--r-- | engines/parallaction/disk.h | 17 | ||||
-rw-r--r-- | engines/parallaction/disk_br.cpp | 5 | ||||
-rw-r--r-- | engines/parallaction/disk_ns.cpp | 245 | ||||
-rw-r--r-- | engines/parallaction/objects.cpp | 9 | ||||
-rw-r--r-- | engines/parallaction/objects.h | 2 |
5 files changed, 116 insertions, 162 deletions
diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h index 4faa9e666c..4cc2711e96 100644 --- a/engines/parallaction/disk.h +++ b/engines/parallaction/disk.h @@ -97,12 +97,18 @@ protected: void addArchive(const Common::String& name, int priority); + virtual void decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 height, Common::SeekableReadStream *stream) = 0; + Cnv *makeCnv(Common::SeekableReadStream *stream); + public: Disk_ns(Parallaction *vm); virtual ~Disk_ns(); Common::String selectArchive(const Common::String &name); void setLanguage(uint16 language); + + virtual Script* loadLocation(const char *name); + virtual Script* loadScript(const char* name); }; class DosDisk_ns : public Disk_ns { @@ -111,14 +117,14 @@ private: void unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path); Cnv* loadCnv(const char *filename); void loadBackground(BackgroundInfo& info, const char *filename); - void loadMaskAndPath(BackgroundInfo& info, const char *name); + void createMaskAndPathBuffers(BackgroundInfo &info); void parseDepths(BackgroundInfo &info, Common::SeekableReadStream &stream); - void parseBackground(BackgroundInfo& info, Common::SeekableReadStream &stream); Font *createFont(const char *name, Cnv* cnv); protected: Gfx *_gfx; virtual Common::SeekableReadStream *tryOpenFile(const char* name); + virtual void decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 height, Common::SeekableReadStream *stream); public: DosDisk_ns(Parallaction *vm); @@ -126,8 +132,6 @@ public: void init(); - Script* loadLocation(const char *name); - Script* loadScript(const char* name); GfxObj* loadTalk(const char *name); GfxObj* loadObjects(const char *name, uint8 part = 0); Frames* loadPointer(const char *name); @@ -145,7 +149,6 @@ public: class AmigaDisk_ns : public Disk_ns { protected: - Cnv* makeCnv(Common::SeekableReadStream *stream); 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); @@ -156,14 +159,14 @@ protected: void loadBackground(BackgroundInfo& info, const char *name); void buildMask(byte* buf); + virtual void decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 height, Common::SeekableReadStream *stream); + 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); GfxObj* loadObjects(const char *name, uint8 part = 0); Frames* loadPointer(const char *name); diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp index e0d498d3df..ec4fc32cc1 100644 --- a/engines/parallaction/disk_br.cpp +++ b/engines/parallaction/disk_br.cpp @@ -396,10 +396,7 @@ void DosDisk_br::loadScenery(BackgroundInfo& info, const char *name, const char Table* DosDisk_br::loadTable(const char* name) { debugC(5, kDebugDisk, "DosDisk_br::loadTable"); - Common::SeekableReadStream *stream = openFile(name, ".tab"); - Table *t = createTableFromStream(100, *stream); - delete stream; - return t; + return createTableFromStream(100, openFile(name, ".tab")); } Common::SeekableReadStream* DosDisk_br::loadMusic(const char* name) { diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp index a43b82b5c0..8aa2a9f543 100644 --- a/engines/parallaction/disk_ns.cpp +++ b/engines/parallaction/disk_ns.cpp @@ -266,16 +266,49 @@ Common::SeekableReadStream *DosDisk_ns::tryOpenFile(const char* name) { return _sset.createReadStreamForMember(path); } +Script* Disk_ns::loadLocation(const char *name) { + char path[PATH_LEN]; -Cnv* DosDisk_ns::loadCnv(const char *filename) { - Common::SeekableReadStream *stream = openFile(filename); + sprintf(path, "%s%s/%s.loc", _vm->_char.getBaseName(), _language.c_str(), name); + debugC(3, kDebugDisk, "Disk_ns::loadLocation(%s): trying '%s'", name, path); + Common::SeekableReadStream *stream = tryOpenFile(path); + + if (!stream) { + sprintf(path, "%s/%s.loc", _language.c_str(), name); + debugC(3, kDebugDisk, "DosDisk_ns::loadLocation(%s): trying '%s'", name, path); + stream = openFile(path); + } + return new Script(stream, true); +} + +Script* Disk_ns::loadScript(const char* name) { + debugC(1, kDebugDisk, "Disk_ns::loadScript '%s'", name); + char path[PATH_LEN]; + sprintf(path, "%s.script", name); + Common::SeekableReadStream *stream = openFile(path); + return new Script(stream, true); +} + +Cnv *Disk_ns::makeCnv(Common::SeekableReadStream *stream) { + assert(stream); uint16 numFrames = stream->readByte(); uint16 width = stream->readByte(); + assert((width & 7) == 0); uint16 height = stream->readByte(); - int32 decsize = numFrames * width * height; + uint32 decsize = numFrames * width * height; byte *data = new byte[decsize]; + assert(data); + memset(data, 0, decsize); + + decodeCnv(data, numFrames, width, height, stream); + delete stream; + return new Cnv(numFrames, width, height, data, true); +} + +void DosDisk_ns::decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 height, Common::SeekableReadStream *stream) { + int32 decsize = numFrames * width * height; bool packed = (stream->size() - stream->pos()) != decsize; if (packed) { Graphics::PackBitsReadStream decoder(*stream); @@ -283,20 +316,21 @@ Cnv* DosDisk_ns::loadCnv(const char *filename) { } else { stream->read(data, decsize); } +} - delete stream; - - return new Cnv(numFrames, width, height, data, true); +Cnv* DosDisk_ns::loadCnv(const char *filename) { + Common::SeekableReadStream *stream = openFile(filename); + assert(stream); + return makeCnv(stream); } GfxObj* DosDisk_ns::loadTalk(const char *name) { const char *ext = strstr(name, ".talk"); - if (ext != NULL) { + if (ext) { // npc talk return new GfxObj(0, loadCnv(name), name); - } char v20[30]; @@ -309,29 +343,6 @@ GfxObj* DosDisk_ns::loadTalk(const char *name) { return new GfxObj(0, loadCnv(v20), name); } -Script* DosDisk_ns::loadLocation(const char *name) { - - char archivefile[PATH_LEN]; - sprintf(archivefile, "%s%s/%s.loc", _vm->_char.getBaseName(), _language.c_str(), name); - - debugC(3, kDebugDisk, "DosDisk_ns::loadLocation(%s): trying '%s'", name, archivefile); - - Common::SeekableReadStream *stream = tryOpenFile(archivefile); - if (!stream) { - sprintf(archivefile, "%s/%s.loc", _language.c_str(), name); - debugC(3, kDebugDisk, "DosDisk_ns::loadLocation(%s): trying '%s'", name, archivefile); - stream = openFile(archivefile); - } - - return new Script(stream, true); -} - -Script* DosDisk_ns::loadScript(const char* name) { - char path[PATH_LEN]; - sprintf(path, "%s.script", name); - Common::SeekableReadStream *stream = openFile(path); - return new Script(stream, true); -} GfxObj* DosDisk_ns::loadHead(const char* name) { char path[PATH_LEN]; @@ -424,106 +435,93 @@ void DosDisk_ns::parseDepths(BackgroundInfo &info, Common::SeekableReadStream &s info.layers[3] = stream.readByte(); } +void DosDisk_ns::createMaskAndPathBuffers(BackgroundInfo &info) { + info._mask = new MaskBuffer; + assert(info._mask); + info._mask->create(info.width, info.height); + info._mask->bigEndian = true; -void DosDisk_ns::parseBackground(BackgroundInfo& info, Common::SeekableReadStream &stream) { + info._path = new PathBuffer; + assert(info._path); + info._path->create(info.width, info.height); + info._path->bigEndian = true; +} - byte tmp[3]; +void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) { + Common::SeekableReadStream *stream = openFile(filename); + + info.width = _vm->_screenWidth; // 320 + info.height = _vm->_screenHeight; // 200 + // read palette + byte tmp[3]; for (uint i = 0; i < 32; i++) { - tmp[0] = stream.readByte(); - tmp[1] = stream.readByte(); - tmp[2] = stream.readByte(); + tmp[0] = stream->readByte(); + tmp[1] = stream->readByte(); + tmp[2] = stream->readByte(); info.palette.setEntry(i, tmp[0], tmp[1], tmp[2]); } - parseDepths(info, stream); + // read z coordinates + parseDepths(info, *stream); + // read palette rotation parameters PaletteFxRange range; for (uint32 _si = 0; _si < 6; _si++) { - range._timer = stream.readUint16BE(); - range._step = stream.readUint16BE(); - range._flags = stream.readUint16BE(); - range._first = stream.readByte(); - range._last = stream.readByte(); - + range._timer = stream->readUint16BE(); + range._step = stream->readUint16BE(); + range._flags = stream->readUint16BE(); + range._first = stream->readByte(); + range._last = stream->readByte(); info.setPaletteRange(_si, range); } -} - -void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) { - Common::SeekableReadStream *stream = openFile(filename); - - info.width = _vm->_screenWidth; // 320 - info.height = _vm->_screenHeight; // 200 - - parseBackground(info, *stream); - + // read bitmap, mask and path data and extract them into the 3 buffers info.bg.create(info.width, info.height, 1); - info._mask = new MaskBuffer; - info._mask->create(info.width, info.height); - info._mask->bigEndian = true; - - info._path = new PathBuffer; - info._path->create(info.width, info.height); - info._path->bigEndian = true; - + createMaskAndPathBuffers(info); unpackBackground(stream, (byte*)info.bg.pixels, info._mask->data, info._path->data); delete stream; } -// -// read background path and mask from a file -// -// mask and path are normally combined (via OR) into the background picture itself -// read the comment on the top of this file for more -// -void DosDisk_ns::loadMaskAndPath(BackgroundInfo& info, const char *name) { - char path[PATH_LEN]; - sprintf(path, "%s.msk", name); - Common::SeekableReadStream *stream = openFile(path); - parseDepths(info, *stream); - info._path = new PathBuffer; - info._path->create(info.width, info.height); - info._path->bigEndian = true; - stream->read(info._path->data, info._path->size); - info._mask = new MaskBuffer; - info._mask->create(info.width, info.height); - info._mask->bigEndian = true; - stream->read(info._mask->data, info._mask->size); - delete stream; -} void DosDisk_ns::loadSlide(BackgroundInfo& info, const char *filename) { char path[PATH_LEN]; sprintf(path, "%s.slide", filename); loadBackground(info, path); - - return; } void DosDisk_ns::loadScenery(BackgroundInfo& info, const char *name, const char *mask, const char* path) { char filename[PATH_LEN]; sprintf(filename, "%s.dyn", name); + // load bitmap loadBackground(info, filename); - if (mask != NULL) { - // load external masks and paths only for certain locations - loadMaskAndPath(info, mask); + if (mask == 0) { + return; } - return; + // load external mask and path if present (overwriting the ones loaded by loadBackground) + char maskPath[PATH_LEN]; + sprintf(maskPath, "%s.msk", mask); + + Common::SeekableReadStream *stream = openFile(maskPath); + assert(stream); + + parseDepths(info, *stream); + + createMaskAndPathBuffers(info); + stream->read(info._path->data, info._path->size); + stream->read(info._mask->data, info._mask->size); + + delete stream; } Table* DosDisk_ns::loadTable(const char* name) { char path[PATH_LEN]; sprintf(path, "%s.tab", name); - Common::SeekableReadStream *stream = openFile(path); - Table *t = createTableFromStream(100, *stream); - delete stream; - return t; + return createTableFromStream(100, openFile(path)); } Common::SeekableReadStream* DosDisk_ns::loadMusic(const char* name) { @@ -534,7 +532,7 @@ Common::SeekableReadStream* DosDisk_ns::loadMusic(const char* name) { Common::SeekableReadStream* DosDisk_ns::loadSound(const char* name) { - return NULL; + return 0; } @@ -583,7 +581,7 @@ private: byte *buf, *out, *dest_end, *off_lens, bits_left = 0, bit_cnt; uint32 bit_buffer = 0, x, todo, offbits, offset, written = 0; - if (src == NULL || dest == NULL) return 0; + if (!src || !dest) return 0; /* set up input and output pointers */ off_lens = src; src = &src[4]; @@ -829,58 +827,17 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b } -Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream) { - assert(stream); - - uint16 numFrames = stream->readByte(); - uint16 width = stream->readByte(); - uint16 height = stream->readByte(); - - assert((width & 7) == 0); - +void AmigaDisk_ns::decodeCnv(byte *data, uint16 numFrames, uint16 width, uint16 height, Common::SeekableReadStream *stream) { byte bytesPerPlane = width / 8; - uint32 rawsize = numFrames * bytesPerPlane * NUM_PLANES * height; - byte *buf = (byte*)malloc(rawsize); + byte *buf = new byte[rawsize]; + assert(buf); stream->read(buf, rawsize); - - uint32 decsize = numFrames * width * height; - byte *data = new byte[decsize]; - memset(data, 0, decsize); - unpackBitmap(data, buf, numFrames, bytesPerPlane, height); - - free(buf); - - delete stream; - - return new Cnv(numFrames, width, height, data, true); + delete []buf; } -#undef NUM_PLANES - -Script* AmigaDisk_ns::loadLocation(const char *name) { - debugC(1, kDebugDisk, "AmigaDisk_ns()::loadLocation '%s'", name); - char path[PATH_LEN]; - sprintf(path, "%s%s/%s.loc", _vm->_char.getBaseName(), _language.c_str(), name); - - Common::SeekableReadStream *stream = tryOpenFile(path); - if (!stream) { - sprintf(path, "%s/%s.loc", _language.c_str(), name); - stream = openFile(path); - } - - debugC(3, kDebugDisk, "location file found: %s", path); - return new Script(stream, true); -} - -Script* AmigaDisk_ns::loadScript(const char* name) { - debugC(1, kDebugDisk, "AmigaDisk_ns::loadScript '%s'", name); - char path[PATH_LEN]; - sprintf(path, "%s.script", name); - Common::SeekableReadStream *stream = openFile(path); - return new Script(stream, true); -} +#undef NUM_PLANES Frames* AmigaDisk_ns::loadPointer(const char* name) { debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer"); @@ -1072,7 +1029,7 @@ void AmigaDisk_ns::loadScenery(BackgroundInfo& info, const char* background, con loadBackground(info, filename); - if (mask == NULL) { + if (mask == 0) { loadMask(info, background); loadPath(info, background); } else { @@ -1154,11 +1111,7 @@ Table* AmigaDisk_ns::loadTable(const char* name) { sprintf(path, "%s.table", name); } - Common::SeekableReadStream *stream = openFile(path); - Table *t = createTableFromStream(100, *stream); - delete stream; - - return t; + return createTableFromStream(100, openFile(path)); } Font* AmigaDisk_ns::loadFont(const char* name) { diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index 85e0215956..4ed198d240 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -423,18 +423,19 @@ void FixedTable::clear() { _used -= deleted; } -Table* createTableFromStream(uint32 size, Common::SeekableReadStream &stream) { +Table* createTableFromStream(uint32 size, Common::SeekableReadStream *stream) { + assert(stream); Table *t = new Table(size); + assert(t); - Script s(&stream, false); - + Script s(stream, false); s.readLineToken(); while (scumm_stricmp(_tokens[0], "ENDTABLE")) { t->addData(_tokens[0]); s.readLineToken(); } - + delete stream; return t; } diff --git a/engines/parallaction/objects.h b/engines/parallaction/objects.h index e4f93c299a..6e4d4439bb 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -541,7 +541,7 @@ public: void clear(); }; -Table* createTableFromStream(uint32 size, Common::SeekableReadStream &stream); +Table* createTableFromStream(uint32 size, Common::SeekableReadStream *stream); } // namespace Parallaction |