aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/disk_ns.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction/disk_ns.cpp')
-rw-r--r--engines/parallaction/disk_ns.cpp225
1 files changed, 108 insertions, 117 deletions
diff --git a/engines/parallaction/disk_ns.cpp b/engines/parallaction/disk_ns.cpp
index c0bb2691ef..8b5ce850ff 100644
--- a/engines/parallaction/disk_ns.cpp
+++ b/engines/parallaction/disk_ns.cpp
@@ -345,7 +345,7 @@ Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
return new Cnv(numFrames, width, height, data);
}
-StaticCnv *DosDisk_ns::loadExternalStaticCnv(const char *filename) {
+Graphics::Surface *DosDisk_ns::loadExternalStaticCnv(const char *filename) {
char path[PATH_LEN];
@@ -356,16 +356,14 @@ StaticCnv *DosDisk_ns::loadExternalStaticCnv(const char *filename) {
if (!stream.open(path))
errorFileNotFound(path);
- StaticCnv *cnv = new StaticCnv;
+ Graphics::Surface *cnv = new Graphics::Surface;
stream.skip(1);
- cnv->_width = stream.readByte();
- cnv->_height = stream.readByte();
+ byte w = stream.readByte();
+ byte h = stream.readByte();
- uint16 size = cnv->_width*cnv->_height;
-
- cnv->_data0 = (byte*)malloc(size);
- stream.read(cnv->_data0, size);
+ cnv->create(w, h, 1);
+ stream.read(cnv->pixels, w*h);
return cnv;
}
@@ -395,7 +393,7 @@ Cnv* DosDisk_ns::loadCnv(const char *filename) {
return new Cnv(numFrames, width, height, data);
}
-Cnv* DosDisk_ns::loadTalk(const char *name) {
+Frames* DosDisk_ns::loadTalk(const char *name) {
const char *ext = strstr(name, ".talk");
if (ext != NULL) {
@@ -462,7 +460,7 @@ Script* DosDisk_ns::loadScript(const char* name) {
return new Script(new DummyArchiveStream(_resArchive), true);
}
-StaticCnv* DosDisk_ns::loadHead(const char* name) {
+Graphics::Surface* DosDisk_ns::loadHead(const char* name) {
char path[PATH_LEN];
@@ -477,8 +475,8 @@ StaticCnv* DosDisk_ns::loadHead(const char* name) {
}
-StaticCnv* DosDisk_ns::loadPointer() {
- return loadExternalStaticCnv("pointer");
+Graphics::Surface* DosDisk_ns::loadPointer(const char *name) {
+ return loadExternalStaticCnv(name);
}
@@ -489,7 +487,7 @@ Font* DosDisk_ns::loadFont(const char* name) {
}
-Cnv* DosDisk_ns::loadObjects(const char *name) {
+Frames* DosDisk_ns::loadObjects(const char *name) {
if (IS_MINI_CHARACTER(name)) {
name += 4;
@@ -501,7 +499,7 @@ Cnv* DosDisk_ns::loadObjects(const char *name) {
}
-StaticCnv* DosDisk_ns::loadStatic(const char* name) {
+Graphics::Surface* DosDisk_ns::loadStatic(const char* name) {
char path[PATH_LEN];
@@ -512,22 +510,21 @@ StaticCnv* DosDisk_ns::loadStatic(const char* name) {
errorFileNotFound(path);
}
- StaticCnv* cnv = new StaticCnv;
+ Graphics::Surface* cnv = new Graphics::Surface;
_resArchive.skip(1);
- cnv->_width = _resArchive.readByte();
- cnv->_height = _resArchive.readByte();
+ byte w = _resArchive.readByte();
+ byte h = _resArchive.readByte();
- uint16 size = cnv->_width*cnv->_height;
- cnv->_data0 = (byte*)malloc(size);
+ cnv->create(w, h, 1);
Graphics::PackBitsReadStream decoder(_resArchive);
- decoder.read(cnv->_data0, size);
+ decoder.read(cnv->pixels, w*h);
return cnv;
}
-Cnv* DosDisk_ns::loadFrames(const char* name) {
+Frames* DosDisk_ns::loadFrames(const char* name) {
return loadCnv(name);
}
@@ -565,10 +562,16 @@ void DosDisk_ns::parseDepths(Common::SeekableReadStream &stream) {
}
-void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
+void DosDisk_ns::parseBackground(BackgroundInfo& info, Common::SeekableReadStream &stream) {
+
+ byte tmp[3];
- stream.read(_vm->_gfx->_palette, BASE_PALETTE_SIZE);
- _vm->_gfx->setPalette(_vm->_gfx->_palette);
+ for (uint i = 0; i < 32; i++) {
+ tmp[0] = stream.readByte();
+ tmp[1] = stream.readByte();
+ tmp[2] = stream.readByte();
+ info.palette.setEntry(i, tmp[0], tmp[1], tmp[2]);
+ }
parseDepths(stream);
@@ -582,28 +585,22 @@ void DosDisk_ns::parseBackground(Common::SeekableReadStream &stream) {
}
-void DosDisk_ns::loadBackground(const char *filename) {
+void DosDisk_ns::loadBackground(BackgroundInfo& info, const char *filename) {
if (!_resArchive.openArchivedFile(filename))
errorFileNotFound(filename);
- parseBackground(_resArchive);
+ info.width = _vm->_screenWidth; // 320
+ info.height = _vm->_screenHeight; // 200
- byte *bg = (byte*)calloc(1, _vm->_screenSize);
- byte *mask = (byte*)calloc(1, _vm->_screenMaskSize);
- byte *path = (byte*)calloc(1, _vm->_screenPathSize);
+ parseBackground(info, _resArchive);
+ info.bg.create(info.width, info.height, 1);
+ info.mask.create(info.width, info.height);
+ info.path.create(info.width, info.height);
Graphics::PackBitsReadStream stream(_resArchive);
- unpackBackground(&stream, bg, mask, path);
-
- _vm->_gfx->setBackground(bg);
- _vm->_gfx->setMask(mask);
- _vm->setPath(path);
-
- free(bg);
- free(mask);
- free(path);
+ unpackBackground(&stream, (byte*)info.bg.pixels, info.mask.data, info.path.data);
return;
}
@@ -614,43 +611,44 @@ void DosDisk_ns::loadBackground(const char *filename) {
// 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(const char *name) {
+void DosDisk_ns::loadMaskAndPath(BackgroundInfo& info, const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.msk", name);
if (!_resArchive.openArchivedFile(path))
errorFileNotFound(name);
- byte *maskBuf = (byte*)calloc(1, _vm->_screenMaskSize);
- byte *pathBuf = (byte*)calloc(1, _vm->_screenPathSize);
-
parseDepths(_resArchive);
- _resArchive.read(pathBuf, _vm->_screenPathSize);
- _resArchive.read(maskBuf, _vm->_screenMaskSize);
+ info.path.create(info.width, info.height);
+ _resArchive.read(info.path.data, info.path.size);
- _vm->_gfx->setMask(maskBuf);
- _vm->setPath(pathBuf);
+ info.mask.create(info.width, info.height);
+ _resArchive.read(info.mask.data, info.mask.size);
return;
}
-void DosDisk_ns::loadSlide(const char *filename) {
+void DosDisk_ns::loadSlide(BackgroundInfo& info, const char *filename) {
char path[PATH_LEN];
sprintf(path, "%s.slide", filename);
- loadBackground(path);
+ loadBackground(info, path);
+
+ return;
}
-void DosDisk_ns::loadScenery(const char *name, const char *mask) {
- char path[PATH_LEN];
- sprintf(path, "%s.dyn", name);
- loadBackground(path);
+void DosDisk_ns::loadScenery(BackgroundInfo& info, const char *name, const char *mask, const char* path) {
+ char filename[PATH_LEN];
+ sprintf(filename, "%s.dyn", name);
+
+ loadBackground(info, filename);
if (mask != NULL) {
// load external masks and paths only for certain locations
- loadMaskAndPath(mask);
+ loadMaskAndPath(info, mask);
}
+ return;
}
Table* DosDisk_ns::loadTable(const char* name) {
@@ -661,13 +659,7 @@ Table* DosDisk_ns::loadTable(const char* name) {
if (!stream.open(path))
errorFileNotFound(path);
- Table *t = new Table(100);
-
- fillBuffers(stream);
- while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
- t->addData(_tokens[0]);
- fillBuffers(stream);
- }
+ Table *t = createTableFromStream(100, stream);
stream.close();
@@ -974,7 +966,7 @@ void AmigaDisk_ns::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 b
}
-StaticCnv* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) {
+Graphics::Surface* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) {
stream.skip(1);
uint16 width = stream.readByte();
@@ -988,19 +980,13 @@ StaticCnv* AmigaDisk_ns::makeStaticCnv(Common::SeekableReadStream &stream) {
byte *buf = (byte*)malloc(rawsize);
stream.read(buf, rawsize);
- uint32 decsize = width * height;
- byte *data = (byte*)calloc(decsize, 1);
+ Graphics::Surface *cnv = new Graphics::Surface;
+ cnv->create(width, height, 1);
- unpackBitmap(data, buf, 1, bytesPerPlane, height);
+ unpackBitmap((byte*)cnv->pixels, buf, 1, bytesPerPlane, height);
free(buf);
- StaticCnv *cnv = new StaticCnv();
- cnv->_width = width;
- cnv->_height = height;
- cnv->_data0 = data;
- cnv->_data1 = NULL;
-
return cnv;
}
@@ -1063,21 +1049,21 @@ Script* AmigaDisk_ns::loadScript(const char* name) {
return new Script(new DummyArchiveStream(_resArchive), true);
}
-StaticCnv* AmigaDisk_ns::loadPointer() {
+Graphics::Surface* AmigaDisk_ns::loadPointer(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer");
Common::File stream;
- if (!stream.open("pointer"))
- errorFileNotFound("pointer");
+ if (!stream.open(name))
+ errorFileNotFound(name);
return makeStaticCnv(stream);
}
-StaticCnv* AmigaDisk_ns::loadStatic(const char* name) {
+Graphics::Surface* AmigaDisk_ns::loadStatic(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
Common::SeekableReadStream *s = openArchivedFile(name, true);
- StaticCnv *cnv = makeStaticCnv(*s);
+ Graphics::Surface *cnv = makeStaticCnv(*s);
delete s;
@@ -1186,28 +1172,38 @@ public:
};
-void AmigaDisk_ns::loadBackground(const char *name) {
+void AmigaDisk_ns::loadBackground(BackgroundInfo& info, const char *name) {
Common::SeekableReadStream *s = openArchivedFile(name, true);
- Graphics::Surface surf;
byte *pal;
- BackgroundDecoder decoder(*s, surf, pal, _vm->_gfx->_palettefx);
+
+ BackgroundDecoder decoder(*s, info.bg, pal, _vm->_gfx->_palettefx);
decoder.decode();
- for (uint32 i = 0; i < BASE_PALETTE_COLORS * 3; i++)
- _vm->_gfx->_palette[i] = pal[i] >> 2;
+ info.width = info.bg.w;
+ info.height = info.bg.h;
+
+ byte *p = pal;
+ for (uint i = 0; i < 32; i++) {
+ byte r = *p >> 2;
+ p++;
+ byte g = *p >> 2;
+ p++;
+ byte b = *p >> 2;
+ p++;
+ info.palette.setEntry(i, r, g, b);
+ }
+
free(pal);
- _vm->_gfx->setPalette(_vm->_gfx->_palette);
- _vm->_gfx->setBackground(static_cast<byte*>(surf.pixels));
- surf.free();
+
delete s;
return;
}
-void AmigaDisk_ns::loadMask(const char *name) {
+void AmigaDisk_ns::loadMask(BackgroundInfo& info, const char *name) {
debugC(5, kDebugDisk, "AmigaDisk_ns::loadMask(%s)", name);
char path[PATH_LEN];
@@ -1236,18 +1232,16 @@ void AmigaDisk_ns::loadMask(const char *name) {
s->seek(0x126, SEEK_SET); // HACK: skipping IFF/ILBM header should be done by analysis, not magic
Graphics::PackBitsReadStream stream(*s);
- byte *buf = (byte*)malloc(_vm->_screenMaskSize);
- stream.read(buf, _vm->_screenMaskSize);
- buildMask(buf);
+ info.mask.create(info.width, info.height);
+ stream.read(info.mask.data, info.mask.size);
+ buildMask(info.mask.data);
- _vm->_gfx->setMask(buf);
- free(buf);
delete s;
return;
}
-void AmigaDisk_ns::loadPath(const char *name) {
+void AmigaDisk_ns::loadPath(BackgroundInfo& info, const char *name) {
char path[PATH_LEN];
sprintf(path, "%s.path", name);
@@ -1260,49 +1254,52 @@ void AmigaDisk_ns::loadPath(const char *name) {
s->seek(0x120, SEEK_SET); // HACK: skipping IFF/ILBM header should be done by analysis, not magic
Graphics::PackBitsReadStream stream(*s);
- byte *buf = (byte*)malloc(_vm->_screenPathSize);
- stream.read(buf, _vm->_screenPathSize);
- _vm->setPath(buf);
- free(buf);
+
+ info.path.create(info.width, info.height);
+ stream.read(info.path.data, info.path.size);
+
delete s;
return;
}
-void AmigaDisk_ns::loadScenery(const char* background, const char* mask) {
+void AmigaDisk_ns::loadScenery(BackgroundInfo& info, const char* background, const char* mask, const char* path) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadScenery '%s', '%s'", background, mask);
- char path[PATH_LEN];
- sprintf(path, "%s.bkgnd", background);
+ char filename[PATH_LEN];
+ sprintf(filename, "%s.bkgnd", background);
- loadBackground(path);
+ loadBackground(info, filename);
if (mask == NULL) {
- loadMask(background);
- loadPath(background);
+ loadMask(info, background);
+ loadPath(info, background);
} else {
- loadMask(mask);
- loadPath(mask);
+ loadMask(info, mask);
+ loadPath(info, mask);
}
return;
}
-void AmigaDisk_ns::loadSlide(const char *name) {
+void AmigaDisk_ns::loadSlide(BackgroundInfo& info, const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadSlide '%s'", name);
char path[PATH_LEN];
sprintf(path, "slides/%s", name);
Common::SeekableReadStream *s = openArchivedFile(path, false);
+
if (s)
- loadBackground(path);
+ loadBackground(info, path);
else
- loadBackground(name);
+ loadBackground(info, name);
+
+ delete s;
return;
}
-Cnv* AmigaDisk_ns::loadFrames(const char* name) {
+Frames* AmigaDisk_ns::loadFrames(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadFrames '%s'", name);
Common::SeekableReadStream *s;
@@ -1320,14 +1317,14 @@ Cnv* AmigaDisk_ns::loadFrames(const char* name) {
return cnv;
}
-StaticCnv* AmigaDisk_ns::loadHead(const char* name) {
+Graphics::Surface* AmigaDisk_ns::loadHead(const char* name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadHead '%s'", name);
char path[PATH_LEN];
sprintf(path, "%s.head", name);
Common::SeekableReadStream *s = openArchivedFile(path, true);
- StaticCnv *cnv = makeStaticCnv(*s);
+ Graphics::Surface *cnv = makeStaticCnv(*s);
delete s;
@@ -1335,7 +1332,7 @@ StaticCnv* AmigaDisk_ns::loadHead(const char* name) {
}
-Cnv* AmigaDisk_ns::loadObjects(const char *name) {
+Frames* AmigaDisk_ns::loadObjects(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadObjects");
char path[PATH_LEN];
@@ -1353,7 +1350,7 @@ Cnv* AmigaDisk_ns::loadObjects(const char *name) {
}
-Cnv* AmigaDisk_ns::loadTalk(const char *name) {
+Frames* AmigaDisk_ns::loadTalk(const char *name) {
debugC(1, kDebugDisk, "AmigaDisk_ns::loadTalk '%s'", name);
Common::SeekableReadStream *s;
@@ -1401,13 +1398,7 @@ Table* AmigaDisk_ns::loadTable(const char* name) {
stream = &_resArchive;
}
- Table *t = new Table(100);
-
- fillBuffers(*stream);
- while (scumm_stricmp(_tokens[0], "ENDTABLE")) {
- t->addData(_tokens[0]);
- fillBuffers(*stream);
- }
+ Table *t = createTableFromStream(100, *stream);
if (dispose)
delete stream;