[Scummvm-cvs-logs] SF.net SVN: scummvm:[40175] scummvm/trunk/engines/parallaction

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Tue Apr 28 14:23:53 CEST 2009


Revision: 40175
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40175&view=rev
Author:   peres001
Date:     2009-04-28 12:23:52 +0000 (Tue, 28 Apr 2009)

Log Message:
-----------
* Disk code cleanup.
* Added ability to load in-game menu graphics.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/disk.h
    scummvm/trunk/engines/parallaction/disk_br.cpp
    scummvm/trunk/engines/parallaction/disk_ns.cpp

Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h	2009-04-28 11:18:43 UTC (rev 40174)
+++ scummvm/trunk/engines/parallaction/disk.h	2009-04-28 12:23:52 UTC (rev 40175)
@@ -109,8 +109,7 @@
 
 private:
 	void unpackBackground(Common::ReadStream *stream, byte *screen, byte *mask, byte *path);
-	Cnv* loadExternalCnv(const char *filename);
-	Frames* loadCnv(const char *filename);
+	Cnv* loadCnv(const char *filename);
 	void loadBackground(BackgroundInfo& info, const char *filename);
 	void loadMaskAndPath(BackgroundInfo& info, const char *name);
 	void parseDepths(BackgroundInfo &info, Common::SeekableReadStream &stream);
@@ -146,7 +145,7 @@
 class AmigaDisk_ns : public Disk_ns {
 
 protected:
-	Cnv* makeCnv(Common::SeekableReadStream *stream, bool disposeStream);
+	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);
@@ -208,7 +207,7 @@
 
 protected:
 	Font *createFont(const char *name, Common::ReadStream &stream);
-	Sprites*	createSprites(Common::ReadStream &stream);
+	Sprites*	createSprites(Common::ReadStream *stream);
 	void loadBitmap(Common::SeekableReadStream &stream, Graphics::Surface &surf, byte *palette);
 	GfxObj* createInventoryObjects(Common::SeekableReadStream &stream);
 
@@ -250,7 +249,7 @@
 class AmigaDisk_br : public DosDisk_br {
 
 protected:
-	Sprites*	createSprites(Common::ReadStream &stream);
+	Sprites*	createSprites(Common::ReadStream *stream);
 	Font *createFont(const char *name, Common::SeekableReadStream &stream);
 	void loadBackground(BackgroundInfo& info, const char *filename);
 	void adjustForPalette(Graphics::Surface &surf, int transparentColor = -1);

Modified: scummvm/trunk/engines/parallaction/disk_br.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_br.cpp	2009-04-28 11:18:43 UTC (rev 40174)
+++ scummvm/trunk/engines/parallaction/disk_br.cpp	2009-04-28 12:23:52 UTC (rev 40175)
@@ -180,13 +180,11 @@
 	// talk position is set to (0,0), because talks are always displayed at
 	// absolute coordinates, set in the dialogue manager. The original used
 	// to null out coordinates every time they were needed. We do it better!
-	Sprites *spr = createSprites(*stream);
+	Sprites *spr = createSprites(stream);
 	for (int i = 0; i < spr->getNum(); i++) {
 		spr->_sprites[i].x = 0;
 		spr->_sprites[i].y = 0;
 	}
-
-	delete stream;
 	return new GfxObj(0, spr, name);
 }
 
@@ -273,33 +271,41 @@
 	return new GfxObj(0, new SurfaceToFrames(surf), name);
 }
 
-Sprites* DosDisk_br::createSprites(Common::ReadStream &stream) {
+Sprites* DosDisk_br::createSprites(Common::ReadStream *stream) {
 
-	uint16 num = stream.readUint16LE();
+	uint16 num = stream->readUint16LE();
 
 	Sprites *sprites = new Sprites(num);
 
 	for (uint i = 0; i < num; i++) {
 		Sprite *spr = &sprites->_sprites[i];
-		spr->size = stream.readUint16LE();
-		spr->x = stream.readUint16LE();
-		spr->y = stream.readUint16LE();
-		spr->w = stream.readUint16LE();
-		spr->h = stream.readUint16LE();
+		spr->size = stream->readUint16LE();
+		spr->x = stream->readUint16LE();
+		spr->y = stream->readUint16LE();
+		spr->w = stream->readUint16LE();
+		spr->h = stream->readUint16LE();
 
 		spr->packedData = (byte*)malloc(spr->size);
-		stream.read(spr->packedData, spr->size);
+		stream->read(spr->packedData, spr->size);
 	}
+	delete stream;
 
 	return sprites;
 }
 
 Frames* DosDisk_br::loadFrames(const char* name) {
+	Common::SeekableReadStream *stream = 0;
+
 	debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
-	Common::SeekableReadStream *stream = openFile("ani/" + Common::String(name), ".ani");
-	Frames *frames = createSprites(*stream);
-	delete stream;
-	return frames;
+
+	Common::String path(name);
+	if (path.hasSuffix(".win")) {
+		stream = openFile(path);
+	} else {
+		stream = openFile("ani/" + Common::String(name), ".ani");
+	}
+
+	return createSprites(stream);
 }
 
 // Slides in Nippon Safes are basically screen-sized pictures with valid
@@ -645,32 +651,41 @@
 	return new GfxObj(0, new SurfaceToFrames(surf), name);
 }
 
-Sprites* AmigaDisk_br::createSprites(Common::ReadStream &stream) {
-	uint16 num = stream.readUint16BE();
+Sprites* AmigaDisk_br::createSprites(Common::ReadStream *stream) {
+	uint16 num = stream->readUint16BE();
 
 	Sprites *sprites = new Sprites(num);
 
 	for (uint i = 0; i < num; i++) {
 		Sprite *spr = &sprites->_sprites[i];
-		spr->size = stream.readUint16BE();
-		spr->x = stream.readUint16BE();
-		spr->y = stream.readUint16BE();
-		spr->w = stream.readUint16BE();
-		spr->h = stream.readUint16BE() - 1;
+		spr->size = stream->readUint16BE();
+		spr->x = stream->readUint16BE();
+		spr->y = stream->readUint16BE();
+		spr->w = stream->readUint16BE();
+		spr->h = stream->readUint16BE() - 1;
 
 		spr->packedData = (byte*)malloc(spr->size);
-		stream.read(spr->packedData, spr->size);
+		stream->read(spr->packedData, spr->size);
 	}
 
+	delete stream;
+
 	return sprites;
 }
 
 Frames* AmigaDisk_br::loadFrames(const char* name) {
-	debugC(1, kDebugDisk, "AmigaDisk_br::loadFrames '%s'", name);
-	Common::SeekableReadStream *stream = openFile("anims/" + Common::String(name), ".ani");
-	Frames *frames = createSprites(*stream);
-	delete stream;
-	return frames;
+	Common::SeekableReadStream *stream = 0;
+
+	debugC(5, kDebugDisk, "AmigaDisk_br::loadFrames");
+
+	Common::String path(name);
+	if (path.hasSuffix(".win")) {
+		stream = openFile(path);
+	} else {
+		stream = openFile("anims/" + Common::String(name), ".ani");
+	}
+
+	return createSprites(stream);
 }
 
 GfxObj* AmigaDisk_br::loadTalk(const char *name) {
@@ -681,13 +696,11 @@
 	// talk position is set to (0,0), because talks are always displayed at
 	// absolute coordinates, set in the dialogue manager. The original used
 	// to null out coordinates every time they were needed. We do it better!
-	Sprites *spr = createSprites(*stream);
+	Sprites *spr = createSprites(stream);
 	for (int i = 0; i < spr->getNum(); i++) {
 		spr->_sprites[i].x = 0;
 		spr->_sprites[i].y = 0;
 	}
-
-	delete stream;
 	return new GfxObj(0, spr, name);
 }
 

Modified: scummvm/trunk/engines/parallaction/disk_ns.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk_ns.cpp	2009-04-28 11:18:43 UTC (rev 40174)
+++ scummvm/trunk/engines/parallaction/disk_ns.cpp	2009-04-28 12:23:52 UTC (rev 40175)
@@ -267,47 +267,29 @@
 }
 
 
-//
-// loads a cnv from an external file
-//
-Cnv* DosDisk_ns::loadExternalCnv(const char *filename) {
-
-	char path[PATH_LEN];
-
-	sprintf(path, "%s.cnv", filename);
-
-	Common::SeekableReadStream *stream = openFile(path);
-
-	uint16 numFrames = stream->readByte();
-	uint16 width = stream->readByte();
-	uint16 height = stream->readByte();
-	uint32 decsize = numFrames * width * height;
-
-	byte *data = new byte[decsize];
-	stream->read(data, decsize);
-	delete stream;
-
-	return new Cnv(numFrames, width, height, data, true);
-}
-
-
-Frames* DosDisk_ns::loadCnv(const char *filename) {
-
+Cnv* DosDisk_ns::loadCnv(const char *filename) {
 	Common::SeekableReadStream *stream = openFile(filename);
 
 	uint16 numFrames = stream->readByte();
 	uint16 width = stream->readByte();
 	uint16 height = stream->readByte();
-	uint32 decsize = numFrames * width * height;
+	int32 decsize = numFrames * width * height;
 	byte *data = new byte[decsize];
 
-	Graphics::PackBitsReadStream decoder(*stream);
-	decoder.read(data, decsize);
+	bool packed = (stream->size() - stream->pos()) != decsize;
+	if (packed) {
+		Graphics::PackBitsReadStream decoder(*stream);
+		decoder.read(data, decsize);
+	} else {
+		stream->read(data, decsize);
+	}
+
 	delete stream;
 
 	return new Cnv(numFrames, width, height, data, true);
 }
 
+
 GfxObj* DosDisk_ns::loadTalk(const char *name) {
 
 	const char *ext = strstr(name, ".talk");
@@ -319,12 +301,12 @@
 
 	char v20[30];
 	if (_engineFlags & kEngineTransformedDonna) {
-		sprintf(v20, "%stta", name);
+		sprintf(v20, "%stta.cnv", name);
 	} else {
-		sprintf(v20, "%stal", name);
+		sprintf(v20, "%stal.cnv", name);
 	}
 
-	return new GfxObj(0, loadExternalCnv(v20), name);
+	return new GfxObj(0, loadCnv(v20), name);
 }
 
 Script* DosDisk_ns::loadLocation(const char *name) {
@@ -355,26 +337,29 @@
 	char path[PATH_LEN];
 	sprintf(path, "%shead", name);
 	path[8] = '\0';
-	return new GfxObj(0, loadExternalCnv(path));
+	strcat(path, ".cnv");
+	return new GfxObj(0, loadCnv(path));
 }
 
 
 Frames* DosDisk_ns::loadPointer(const char *name) {
-	return loadExternalCnv(name);
+	char path[PATH_LEN];
+	sprintf(path, "%s.cnv", name);
+	return loadCnv(path);
 }
 
 
 Font* DosDisk_ns::loadFont(const char* name) {
 	char path[PATH_LEN];
-	sprintf(path, "%scnv", name);
-	return createFont(name, loadExternalCnv(path));
+	sprintf(path, "%scnv.cnv", name);
+	return createFont(name, loadCnv(path));
 }
 
 
 GfxObj* DosDisk_ns::loadObjects(const char *name, uint8 part) {
 	char path[PATH_LEN];
-	sprintf(path, "%sobj", name);
-	return new GfxObj(0, loadExternalCnv(path), name);
+	sprintf(path, "%sobj.cnv", name);
+	return new GfxObj(0, loadCnv(path), name);
 }
 
 
@@ -844,7 +829,7 @@
 }
 
 
-Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream, bool disposeStream) {
+Cnv* AmigaDisk_ns::makeCnv(Common::SeekableReadStream *stream) {
 	assert(stream);
 
 	uint16 numFrames = stream->readByte();
@@ -867,8 +852,7 @@
 
 	free(buf);
 
-	if (disposeStream)
-		delete stream;
+	delete stream;
 
 	return new Cnv(numFrames, width, height, data, true);
 }
@@ -901,13 +885,13 @@
 Frames* AmigaDisk_ns::loadPointer(const char* name) {
 	debugC(1, kDebugDisk, "AmigaDisk_ns::loadPointer");
 	Common::SeekableReadStream *stream = openFile(name);
-	return makeCnv(stream, true);
+	return makeCnv(stream);
 }
 
 GfxObj* AmigaDisk_ns::loadStatic(const char* name) {
 	debugC(1, kDebugDisk, "AmigaDisk_ns::loadStatic '%s'", name);
 	Common::SeekableReadStream *s = openFile(name);
-	return new GfxObj(0, makeCnv(s, true), name);
+	return new GfxObj(0, makeCnv(s), name);
 }
 
 Common::SeekableReadStream *AmigaDisk_ns::tryOpenFile(const char* name) {
@@ -1115,7 +1099,7 @@
 	if (!s)
 		s = openFile(name);
 
-	return makeCnv(s, true);
+	return makeCnv(s);
 }
 
 GfxObj* AmigaDisk_ns::loadHead(const char* name) {
@@ -1123,7 +1107,7 @@
 	char path[PATH_LEN];
 	sprintf(path, "%s.head", name);
 	Common::SeekableReadStream *s = openFile(path);
-	return new GfxObj(0, makeCnv(s, true), name);
+	return new GfxObj(0, makeCnv(s), name);
 }
 
 
@@ -1137,7 +1121,7 @@
 		sprintf(path, "objs/%s.objs", name);
 
 	Common::SeekableReadStream *s = openFile(path);
-	return new GfxObj(0, makeCnv(s, true), name);
+	return new GfxObj(0, makeCnv(s), name);
 }
 
 
@@ -1154,7 +1138,7 @@
 	if (!s) {
 		s = openFile(name);
 	}
-	return new GfxObj(0, makeCnv(s, true), name);
+	return new GfxObj(0, makeCnv(s), name);
 }
 
 Table* AmigaDisk_ns::loadTable(const char* name) {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list