[Scummvm-git-logs] scummvm master -> 2ffcd003932a4abf24494a03d682a8dcb20820b3

SupSuper supsuper at gmail.com
Mon May 31 20:38:00 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
2ffcd00393 TRECISION: BM files are always little-endian


Commit: 2ffcd003932a4abf24494a03d682a8dcb20820b3
    https://github.com/scummvm/scummvm/commit/2ffcd003932a4abf24494a03d682a8dcb20820b3
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T21:37:37+01:00

Commit Message:
TRECISION: BM files are always little-endian

Changed paths:
    engines/trecision/fastfile.cpp
    engines/trecision/resource.cpp
    engines/trecision/struct.cpp
    engines/trecision/struct.h
    engines/trecision/trecision.cpp
    engines/trecision/trecision.h


diff --git a/engines/trecision/fastfile.cpp b/engines/trecision/fastfile.cpp
index d403b30a1a..3526f8062c 100644
--- a/engines/trecision/fastfile.cpp
+++ b/engines/trecision/fastfile.cpp
@@ -24,6 +24,7 @@
 #include "common/str.h"
 #include "common/substream.h"
 #include "common/memstream.h"
+#include "common/file.h"
 #include "trecision/trecision.h"
 #include "trecision/fastfile.h"
 #include "trecision/video.h"
@@ -93,13 +94,28 @@ Common::SeekableReadStream *FastFile::createReadStreamForMember(const Common::St
 	if (!_stream)
 		return nullptr;
 
+	Common::SeekableReadStream *stream = nullptr;
 	const FileEntry *entry = getEntry(name);
 	if (entry) {
 		uint32 size = (entry + 1)->offset - entry->offset;
-		return new Common::SeekableSubReadStream(_stream, entry->offset, entry->offset + size);
+		if (entry->offset + size < _stream->size()) {
+			// Load data from fast file
+			stream = new Common::SeekableSubReadStream(_stream, entry->offset, entry->offset + size);
+		}
 	}
-
-	return nullptr;
+	if (!stream) {
+		// Load data from external file
+		Common::File *file = new Common::File();
+		if (file->open(name)) {
+			stream = file;
+		} else {
+			delete file;
+		}
+	}
+	if (!stream) {
+		warning("FastFile - %s not found", name.c_str());
+	}
+	return stream;
 }
 
 void FastFile::decompress(const unsigned char *src, uint32 srcSize, unsigned char *dst, uint32 decompSize) {
diff --git a/engines/trecision/resource.cpp b/engines/trecision/resource.cpp
index 68cac589e9..1b98eb50e4 100644
--- a/engines/trecision/resource.cpp
+++ b/engines/trecision/resource.cpp
@@ -85,6 +85,10 @@ void TrecisionEngine::loadAll() {
 
 	data->skip(620);	// actions (unused)
 
+	// TODO: Amiga hack
+	if (isAmiga())
+		dataNl.seek(0x3DB62);
+
 	int numFileRef = data->readSint32();
 	data->skip(numFileRef * (12 + 4));	// fileRef name + offset
 
@@ -137,7 +141,7 @@ void TrecisionEngine::read3D(const Common::String &filename) {
 	_renderer->setClipping(0, TOP, MAXX, AREA + TOP);
 }
 
-void TrecisionEngine::readObject(Common::SeekableReadStreamEndian *stream, uint16 objIndex, uint16 objectId) {
+void TrecisionEngine::readObject(Common::SeekableReadStream *stream, uint16 objIndex, uint16 objectId) {
 	SObject *obj = &_obj[objectId];
 
 	if (obj->isModeFull()) {
@@ -147,7 +151,7 @@ void TrecisionEngine::readObject(Common::SeekableReadStreamEndian *stream, uint1
 		delete[] _objPointers[objIndex];
 		_objPointers[objIndex] = new uint16[size];
 		for (uint32 i = 0; i < size; ++i)
-			_objPointers[objIndex][i] = stream->readUint16();
+			_objPointers[objIndex][i] = stream->readUint16LE();
 
 		_graphicsMgr->updatePixelFormat(_objPointers[objIndex], size);
 	}
@@ -155,15 +159,15 @@ void TrecisionEngine::readObject(Common::SeekableReadStreamEndian *stream, uint1
 	if (obj->isModeMask()) {
 		obj->readRect(stream);
 
-		uint32 size = stream->readUint32();
+		uint32 size = stream->readUint32LE();
 		delete[] _objPointers[objIndex];
 		_objPointers[objIndex] = new uint16[size];
 		for (uint32 i = 0; i < size; ++i)
-			_objPointers[objIndex][i] = stream->readUint16();
+			_objPointers[objIndex][i] = stream->readUint16LE();
 
 		_graphicsMgr->updatePixelFormat(_objPointers[objIndex], size);
 
-		size = stream->readUint32();
+		size = stream->readUint32LE();
 		delete[] _maskPointers[objIndex];
 		_maskPointers[objIndex] = new uint8[size];
 		for (uint32 i = 0; i < size; ++i)
@@ -173,7 +177,7 @@ void TrecisionEngine::readObject(Common::SeekableReadStreamEndian *stream, uint1
 	refreshObject(objectId);
 }
 
-void TrecisionEngine::readObj(Common::SeekableReadStreamEndian *stream) {
+void TrecisionEngine::readObj(Common::SeekableReadStream *stream) {
 	if (!_room[_curRoom]._object[0])
 		return;
 
@@ -196,7 +200,7 @@ void TrecisionEngine::readExtraObj2C() {
 	if (!_room[_curRoom]._object[32])
 		return;
 
-	Common::SeekableReadStreamEndian *ff = readEndian(_dataFile.createReadStreamForMember("2c2.bm"));
+	Common::SeekableReadStream *ff = _dataFile.createReadStreamForMember("2c2.bm");
 
 	for (uint16 objIndex = PATCHOBJ_ROOM2C; objIndex < MAXOBJINROOM; objIndex++) {
 		const uint16 objectId = _room[_curRoom]._object[objIndex];
@@ -213,7 +217,7 @@ void TrecisionEngine::readExtraObj41D() {
 	if (!_room[_curRoom]._object[32])
 		return;
 
-	Common::SeekableReadStreamEndian *ff = readEndian(_dataFile.createReadStreamForMember("41d2.bm"));
+	Common::SeekableReadStream *ff = _dataFile.createReadStreamForMember("41d2.bm");
 	for (uint16 objIndex = PATCHOBJ_ROOM41D; objIndex < MAXOBJINROOM; objIndex++) {
 		const uint16 objectId = _room[_curRoom]._object[objIndex];
 		if (!objectId)
diff --git a/engines/trecision/struct.cpp b/engines/trecision/struct.cpp
index 3f5a78d683..e5e1f87933 100644
--- a/engines/trecision/struct.cpp
+++ b/engines/trecision/struct.cpp
@@ -47,11 +47,11 @@ void SRoom::syncGameStream(Common::Serializer &ser) {
 
 /********************************************************************/
 
-void SObject::readRect(Common::SeekableReadStreamEndian *stream) {
-	_rect.left = stream->readUint16();
-	_rect.top = stream->readUint16();
-	_rect.setWidth(stream->readUint16());
-	_rect.setHeight(stream->readUint16());
+void SObject::readRect(Common::SeekableReadStream *stream) {
+	_rect.left = stream->readUint16LE();
+	_rect.top = stream->readUint16LE();
+	_rect.setWidth(stream->readUint16LE());
+	_rect.setHeight(stream->readUint16LE());
 }
 
 void SObject::syncGameStream(Common::Serializer &ser) {
diff --git a/engines/trecision/struct.h b/engines/trecision/struct.h
index 93c98b1d04..292ee29e4a 100644
--- a/engines/trecision/struct.h
+++ b/engines/trecision/struct.h
@@ -63,7 +63,7 @@ struct SObject {
 	uint8 _ninv;                            // ptr inventory
 	uint16 _anim;
 	
-	void readRect(Common::SeekableReadStreamEndian *stream);
+	void readRect(Common::SeekableReadStream *stream);
 	void setFlagDone(bool on) { if (on) _flag |= kObjFlagDone; else _flag &= ~kObjFlagDone; }
 	void setFlagExamine(bool on) { if (on) _flag |= kObjFlagExamine; else _flag &= ~kObjFlagExamine; }
 	void setFlagExtra(bool on) { if (on) _flag |= kObjFlagExtra; else _flag &= ~kObjFlagExtra; }
diff --git a/engines/trecision/trecision.cpp b/engines/trecision/trecision.cpp
index c444637d47..dc230ca944 100644
--- a/engines/trecision/trecision.cpp
+++ b/engines/trecision/trecision.cpp
@@ -54,6 +54,12 @@ TrecisionEngine::TrecisionEngine(OSystem *syst, const ADGameDescription *desc) :
 	SearchMan.addSubDirectoryMatching(gameDataDir, "AUTORUN");
 	SearchMan.addSubDirectoryMatching(gameDataDir, "DATA");
 	SearchMan.addSubDirectoryMatching(gameDataDir, "FMV");
+	// Amiga version loads data files from directories
+	if (isAmiga()) {
+		SearchMan.addSubDirectoryMatching(gameDataDir, "NLDATA.CD0");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "NLSPEECH.CD0");
+		SearchMan.addSubDirectoryMatching(gameDataDir, "NLANIM.CDX");
+	}
 
 	_curRoom = 0;
 	_oldRoom = 0;
@@ -376,8 +382,15 @@ void TrecisionEngine::readLoc() {
 
 	_graphicsMgr->clearScreenBufferTop();
 
-	Common::String filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
-	Common::SeekableReadStreamEndian *picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
+	Common::String filename;
+	Common::SeekableReadStreamEndian *picFile;
+	if (isAmiga()) {
+		filename = Common::String::format("%s.bm", _room[_curRoom]._baseName);
+		picFile = readEndian(_dataFile.createReadStreamForMember(filename));
+	} else {
+		filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
+		picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
+	}
 
 	SObject bgInfo;
 	bgInfo.readRect(picFile);
@@ -427,8 +440,15 @@ void TrecisionEngine::redrawRoom() {
 		}
 	}
 
-	Common::String filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
-	Common::SeekableReadStreamEndian *picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
+	Common::String filename;
+	Common::SeekableReadStreamEndian *picFile;
+	if (isAmiga()) {
+		filename = Common::String::format("%s.bm", _room[_curRoom]._baseName);
+		picFile = readEndian(_dataFile.createReadStreamForMember(filename));
+	} else {
+		filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
+		picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
+	}
 
 	SObject bgInfo;
 	bgInfo.readRect(picFile);
diff --git a/engines/trecision/trecision.h b/engines/trecision/trecision.h
index 68337f829e..a73d5c77ae 100644
--- a/engines/trecision/trecision.h
+++ b/engines/trecision/trecision.h
@@ -135,8 +135,8 @@ class TrecisionEngine : public Engine {
 	bool canPlayerInteract();
 
 	// Objects
-	void readObj(Common::SeekableReadStreamEndian *stream);
-	void readObject(Common::SeekableReadStreamEndian *stream, uint16 objIndex, uint16 objectId);
+	void readObj(Common::SeekableReadStream *stream);
+	void readObject(Common::SeekableReadStream *stream, uint16 objIndex, uint16 objectId);
 
 	char *_textArea;
 	uint16 _curScriptFrame[10];




More information about the Scummvm-git-logs mailing list