[Scummvm-git-logs] scummvm master -> 62f62b6b620051ec8e9d512175a15cc335e9f3a7

SupSuper supsuper at gmail.com
Mon May 31 05:40:58 UTC 2021


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

Summary:
5daeab2e76 COMMON: Add floating-point functions to ReadStreamEndian
49c4c26b44 TRECISION: Experimental support for Nightlong Amiga
229d9415a0 TRECISION: Amiga files are big-endian
c8be95585c TRECISION: Amiga uses raw audio format
48b9f54bfc COMMON: Add support for fixed-size strings in ReadStream::readString
62f62b6b62 TRECISION: Add endianness to FastFile


Commit: 5daeab2e763a357f19837e27773c7df10e22ed62
    https://github.com/scummvm/scummvm/commit/5daeab2e763a357f19837e27773c7df10e22ed62
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:03+01:00

Commit Message:
COMMON: Add floating-point functions to ReadStreamEndian

Changed paths:
    common/stream.h


diff --git a/common/stream.h b/common/stream.h
index 8b92a94a5a..082ec3d6b8 100644
--- a/common/stream.h
+++ b/common/stream.h
@@ -834,6 +834,32 @@ public:
 	FORCEINLINE int64 readSint64() {
 		return (int64)readUint64();
 	}
+
+	/**
+	 * Read a 32-bit floating point value using the stream endianness
+	 * and return it in native endianness.
+	 */
+	FORCEINLINE float readFloat() {
+		uint32 n = readUint32();
+		float f;
+
+		memcpy(&f, &n, 4);
+
+		return f;
+	}
+
+	/**
+	 * Read a 64-bit floating point value using the stream endianness
+	 * and return it in native endianness.
+	 */
+	FORCEINLINE double readDouble() {
+		uint64 n = readUint64();
+		double d;
+
+		memcpy(&d, &n, 8);
+
+		return d;
+	}
 };
 
 /**


Commit: 49c4c26b4437360f58e903e3c72ac9f1fad392ef
    https://github.com/scummvm/scummvm/commit/49c4c26b4437360f58e903e3c72ac9f1fad392ef
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:04+01:00

Commit Message:
TRECISION: Experimental support for Nightlong Amiga

Changed paths:
    engines/trecision/detection.cpp


diff --git a/engines/trecision/detection.cpp b/engines/trecision/detection.cpp
index 6e72cebfd3..90395cb1a3 100644
--- a/engines/trecision/detection.cpp
+++ b/engines/trecision/detection.cpp
@@ -120,6 +120,51 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_DEMO,
 		GUIO0()
 	},
+	{
+		"nl",
+		0,
+		AD_NL_ENTRY("2bfc3f5cc1ee5c7e80058db853296416", 436807),
+		Common::EN_ANY,
+		Common::kPlatformAmiga,
+		ADGF_UNSTABLE,
+		GUIO0()
+	},
+	{
+		"nl",
+		0,
+		AD_NL_ENTRY("2bfc3f5cc1ee5c7e80058db853296416", 457508),
+		Common::DE_DEU,
+		Common::kPlatformAmiga,
+		ADGF_UNSTABLE,
+		GUIO0()
+	},
+	{
+		"nl",
+		0,
+		AD_NL_ENTRY("2bfc3f5cc1ee5c7e80058db853296416", 436842),
+		Common::ES_ESP,
+		Common::kPlatformAmiga,
+		ADGF_UNSTABLE,
+		GUIO0()
+	},
+	{
+		"nl",
+		0,
+		AD_NL_ENTRY("2bfc3f5cc1ee5c7e80058db853296416", 456354),
+		Common::FR_FRA,
+		Common::kPlatformAmiga,
+		ADGF_UNSTABLE,
+		GUIO0()
+	},
+	{
+		"nl",
+		0,
+		AD_NL_ENTRY("2bfc3f5cc1ee5c7e80058db853296416", 446779),
+		Common::IT_ITA,
+		Common::kPlatformAmiga,
+		ADGF_UNSTABLE,
+		GUIO0()
+	},
 
 	AD_TABLE_END_MARKER
 };


Commit: 229d9415a0a8b5cc12ef3e0a3bb8728efaa5e064
    https://github.com/scummvm/scummvm/commit/229d9415a0a8b5cc12ef3e0a3bb8728efaa5e064
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:04+01:00

Commit Message:
TRECISION: Amiga files are big-endian

Changed paths:
    engines/trecision/3d.cpp
    engines/trecision/3d.h
    engines/trecision/actor.cpp
    engines/trecision/actor.h
    engines/trecision/dialog.cpp
    engines/trecision/dialog.h
    engines/trecision/resource.cpp
    engines/trecision/sound.cpp
    engines/trecision/sound.h
    engines/trecision/struct.cpp
    engines/trecision/struct.h
    engines/trecision/trecision.cpp
    engines/trecision/trecision.h
    engines/trecision/video.cpp
    engines/trecision/video.h


diff --git a/engines/trecision/3d.cpp b/engines/trecision/3d.cpp
index 999d908c5f..f05f930fa0 100644
--- a/engines/trecision/3d.cpp
+++ b/engines/trecision/3d.cpp
@@ -2073,19 +2073,19 @@ void PathFinding3D::initSortPan() {
 	}
 }
 
-void PathFinding3D::read3D(Common::SeekableReadStream *ff) {
+void PathFinding3D::read3D(Common::SeekableReadStreamEndian *ff) {
 	// read panels
-	_panelNum = ff->readSint32LE();
+	_panelNum = ff->readSint32();
 	if (_panelNum > MAXPANELSINROOM)
 		error("read3D(): Too many panels");
 
 	for (int i = 0; i < _panelNum; ++i) {
-		_panel[i]._x1 = ff->readFloatLE();
-		_panel[i]._z1 = ff->readFloatLE();
-		_panel[i]._x2 = ff->readFloatLE();
-		_panel[i]._z2 = ff->readFloatLE();
-		_panel[i]._h = ff->readFloatLE();
-		_panel[i]._flags = ff->readUint32LE();
+		_panel[i]._x1 = ff->readFloat();
+		_panel[i]._z1 = ff->readFloat();
+		_panel[i]._x2 = ff->readFloat();
+		_panel[i]._z2 = ff->readFloat();
+		_panel[i]._h = ff->readFloat();
+		_panel[i]._flags = ff->readUint32();
 
 		// Note : Despite the panels are stored in an int16 with a MAXPANELSINROOM set to 400,
 		// _panelNum is stored in a int32 and nearPanel1 and 2 were stored in an int8
diff --git a/engines/trecision/3d.h b/engines/trecision/3d.h
index ff6b264f07..e708a8e6fa 100644
--- a/engines/trecision/3d.h
+++ b/engines/trecision/3d.h
@@ -196,7 +196,7 @@ public:
 	void goToPosition(int num);
 	int nextStep();
 	void initSortPan();
-	void read3D(Common::SeekableReadStream *ff);
+	void read3D(Common::SeekableReadStreamEndian *ff);
 	void reset(uint16 idx, float px, float pz, float theta);
 	void whereIs(int px, int py);
 	void actorOrder();
diff --git a/engines/trecision/actor.cpp b/engines/trecision/actor.cpp
index 76525a00ed..c13ef28612 100644
--- a/engines/trecision/actor.cpp
+++ b/engines/trecision/actor.cpp
@@ -309,50 +309,50 @@ void Actor::microproseHeadFix(uint32 actionNum) {
 }
 
 void Actor::readModel(const char *filename) {
-	Common::SeekableReadStream *ff = _vm->_dataFile.createReadStreamForMember(filename);
+	Common::SeekableReadStreamEndian *ff = _vm->readEndian(_vm->_dataFile.createReadStreamForMember(filename));
 	if (ff == nullptr)
 		error("readModel - Error opening file %s", filename);
 
-	uint32 actionNum = ff->readUint32LE();
-	_vertexNum = ff->readUint32LE();
+	uint32 actionNum = ff->readUint32();
+	_vertexNum = ff->readUint32();
 
 	_characterArea = new SVertex[_vertexNum * actionNum];
 	for (uint i = 0; i < _vertexNum * actionNum; ++i) {
-		_characterArea[i]._x = ff->readFloatLE();
-		_characterArea[i]._y = ff->readFloatLE();
-		_characterArea[i]._z = ff->readFloatLE();
-		_characterArea[i]._nx = ff->readFloatLE();
-		_characterArea[i]._ny = ff->readFloatLE();
-		_characterArea[i]._nz = ff->readFloatLE();
+		_characterArea[i]._x = ff->readFloat();
+		_characterArea[i]._y = ff->readFloat();
+		_characterArea[i]._z = ff->readFloat();
+		_characterArea[i]._nx = ff->readFloat();
+		_characterArea[i]._ny = ff->readFloat();
+		_characterArea[i]._nz = ff->readFloat();
 	}
 	_vertex = _characterArea;
-	_faceNum = ff->readUint32LE();
+	_faceNum = ff->readUint32();
 	delete ff;
 
-	ff = _vm->_dataFile.createReadStreamForMember("mat.tex");
+	ff = _vm->readEndian(_vm->_dataFile.createReadStreamForMember("mat.tex"));
 	if (ff == nullptr)
 		error("readModel - Error opening file mat.tex");
 
 	for (uint16 i = 0; i < 256; ++i) {
 		for (uint16 j = 0; j < 91; ++j)
-			_textureMat[i][j] = ff->readUint16LE();
+			_textureMat[i][j] = ff->readUint16();
 	}
 
 	_vm->_graphicsMgr->updatePixelFormat((uint16 *)_textureMat, 91 * 256);
 
 	for (uint16 i = 0; i < MAXFACE; ++i) {
 		for (uint16 j = 0; j < 3; ++j) {
-			_textureCoord[i][j][0] = ff->readSint16LE();
-			_textureCoord[i][j][1] = ff->readSint16LE();
+			_textureCoord[i][j][0] = ff->readSint16();
+			_textureCoord[i][j][1] = ff->readSint16();
 		}
 	}
 
 	_face = new SFace[_faceNum];
 	for (uint i = 0; i < _faceNum; ++i) {
-		_face[i]._a = ff->readUint16LE();
-		_face[i]._b = ff->readUint16LE();
-		_face[i]._c = ff->readUint16LE();
-		_face[i]._mat = ff->readUint16LE();
+		_face[i]._a = ff->readUint16();
+		_face[i]._b = ff->readUint16();
+		_face[i]._c = ff->readUint16();
+		_face[i]._mat = ff->readUint16();
 	}
 
 	delete ff;
@@ -444,34 +444,34 @@ void Actor::actorStop() {
 	_vm->_pathFind->_lastStep = 0;
 }
 
-void Actor::read3D(Common::SeekableReadStream *ff) {
+void Actor::read3D(Common::SeekableReadStreamEndian *ff) {
 	// read rooms and lights
 	SCamera *cam = _camera;
-	cam->_ex = ff->readFloatLE();
-	cam->_ey = ff->readFloatLE();
-	cam->_ez = ff->readFloatLE();
+	cam->_ex = ff->readFloat();
+	cam->_ey = ff->readFloat();
+	cam->_ez = ff->readFloat();
 	for (int i = 0; i < 3; ++i)
-		cam->_e1[i] = ff->readFloatLE();
+		cam->_e1[i] = ff->readFloat();
 	for (int i = 0; i < 3; ++i)
-		cam->_e2[i] = ff->readFloatLE();
+		cam->_e2[i] = ff->readFloat();
 	for (int i = 0; i < 3; ++i)
-		cam->_e3[i] = ff->readFloatLE();
-	cam->_fovX = ff->readFloatLE();
-	cam->_fovY = ff->readFloatLE();
+		cam->_e3[i] = ff->readFloat();
+	cam->_fovX = ff->readFloat();
+	cam->_fovY = ff->readFloat();
 
-	_lightNum = ff->readUint32LE();
+	_lightNum = ff->readUint32();
 	if (_lightNum > MAXLIGHT)
 		error("read3D(): Too many lights");
 
 	for (uint32 i = 0; i < _lightNum; ++i) {
-		_light[i]._x = ff->readFloatLE();
-		_light[i]._y = ff->readFloatLE();
-		_light[i]._z = ff->readFloatLE();
-		_light[i]._dx = ff->readFloatLE();
-		_light[i]._dy = ff->readFloatLE();
-		_light[i]._dz = ff->readFloatLE();
-		_light[i]._inr = ff->readFloatLE();
-		_light[i]._outr = ff->readFloatLE();
+		_light[i]._x = ff->readFloat();
+		_light[i]._y = ff->readFloat();
+		_light[i]._z = ff->readFloat();
+		_light[i]._dx = ff->readFloat();
+		_light[i]._dy = ff->readFloat();
+		_light[i]._dz = ff->readFloat();
+		_light[i]._inr = ff->readFloat();
+		_light[i]._outr = ff->readFloat();
 		_light[i]._hotspot = ff->readByte();
 		_light[i]._fallOff = ff->readByte();
 		_light[i]._inten = ff->readSByte();
diff --git a/engines/trecision/actor.h b/engines/trecision/actor.h
index b93d164318..6b5d2ebfbb 100644
--- a/engines/trecision/actor.h
+++ b/engines/trecision/actor.h
@@ -76,7 +76,7 @@ public:
 	void syncGameStream(Common::Serializer &ser);
 	void actorDoAction(int action);
 	void actorStop();
-	void read3D(Common::SeekableReadStream *ff);
+	void read3D(Common::SeekableReadStreamEndian *ff);
 	float frameCenter(SVertex *v);
 	void updateStepSound();
 };
diff --git a/engines/trecision/dialog.cpp b/engines/trecision/dialog.cpp
index b6f92dbd63..164f320dc0 100644
--- a/engines/trecision/dialog.cpp
+++ b/engines/trecision/dialog.cpp
@@ -698,50 +698,50 @@ void DialogManager::syncGameStream(Common::Serializer &ser) {
 	}
 }
 
-void DialogManager::loadData(Common::File *file) {
+void DialogManager::loadData(Common::SeekableReadStreamEndian *stream) {
 	for (int i = 0; i < MAXDIALOG; ++i) {
 		Dialog *dialog = &_dialog[i];
 
-		dialog->_flag = file->readUint16LE();
-		dialog->_interlocutor = file->readUint16LE();
+		dialog->_flag = stream->readUint16();
+		dialog->_interlocutor = stream->readUint16();
 
-		file->read(&dialog->_startAnim, 14);
+		stream->read(&dialog->_startAnim, 14);
 
-		dialog->_startLen = file->readUint16LE();
-		dialog->_firstChoice = file->readUint16LE();
-		dialog->_choiceNumb = file->readUint16LE();
+		dialog->_startLen = stream->readUint16();
+		dialog->_firstChoice = stream->readUint16();
+		dialog->_choiceNumb = stream->readUint16();
 
 		for (int j = 0; j < MAXNEWSMKPAL; ++j)
-			dialog->_newPal[j] = file->readUint16LE();
+			dialog->_newPal[j] = stream->readUint16();
 	}
 
 	for (int i = 0; i < MAXCHOICE; ++i) {
 		DialogChoice *choice = &_choice[i];
 
-		choice->_flag = file->readUint16LE();
-		choice->_sentenceIndex = file->readUint16LE();
-		choice->_firstSubTitle = file->readUint16LE();
-		choice->_subTitleNumb = file->readUint16LE();
+		choice->_flag = stream->readUint16();
+		choice->_sentenceIndex = stream->readUint16();
+		choice->_firstSubTitle = stream->readUint16();
+		choice->_subTitleNumb = stream->readUint16();
 
 		for (int j = 0; j < MAXDISPCHOICES; ++j)
-			choice->_on[j] = file->readUint16LE();
+			choice->_on[j] = stream->readUint16();
 
 		for (int j = 0; j < MAXDISPCHOICES; ++j)
-			choice->_off[j] = file->readUint16LE();
+			choice->_off[j] = stream->readUint16();
 
-		choice->_startFrame = file->readUint16LE();
-		choice->_nextDialog = file->readUint16LE();
+		choice->_startFrame = stream->readUint16();
+		choice->_nextDialog = stream->readUint16();
 	}
 
 	for (int i = 0; i < MAXSUBTITLES; ++i) {
 		DialogSubTitle *subTitle = &_subTitles[i];
 
-		subTitle->_sentence = file->readUint16LE();
-		subTitle->_x = file->readUint16LE();
-		subTitle->_y = file->readUint16LE();
-		subTitle->_color = file->readUint16LE();
-		subTitle->_startFrame = file->readUint16LE();
-		subTitle->_length = file->readUint16LE();
+		subTitle->_sentence = stream->readUint16();
+		subTitle->_x = stream->readUint16();
+		subTitle->_y = stream->readUint16();
+		subTitle->_color = stream->readUint16();
+		subTitle->_startFrame = stream->readUint16();
+		subTitle->_length = stream->readUint16();
 	}
 
 	if (_vm->isDemo()) {
diff --git a/engines/trecision/dialog.h b/engines/trecision/dialog.h
index ca03bceff4..ba1bf03a7c 100644
--- a/engines/trecision/dialog.h
+++ b/engines/trecision/dialog.h
@@ -25,7 +25,7 @@
 
 #include "common/scummsys.h"
 #include "common/serializer.h"
-#include "common/file.h"
+#include "common/stream.h"
 
 namespace Trecision {
 class TrecisionEngine;
@@ -99,7 +99,7 @@ public:
 	uint16 getCurDialog() const { return _curDialog; }
 	uint16 getCurChoice() const { return _curChoice; }
 	void syncGameStream(Common::Serializer &ser);
-	void loadData(Common::File *file);
+	void loadData(Common::SeekableReadStreamEndian *stream);
 };
 // end of class
 
diff --git a/engines/trecision/resource.cpp b/engines/trecision/resource.cpp
index e6749babda..043188b4f9 100644
--- a/engines/trecision/resource.cpp
+++ b/engines/trecision/resource.cpp
@@ -26,6 +26,7 @@
 #include "common/savefile.h"
 #include "common/str.h"
 #include "common/translation.h"
+#include "common/substream.h"
 #include "gui/saveload.h"
 
 #include "trecision/trecision.h"
@@ -38,55 +39,63 @@
 #include "trecision/video.h"
 #include "trecision/sound.h"
 
-namespace Common {
-class File;
-}
-
 namespace Trecision {
 
+Common::SeekableReadStreamEndian *TrecisionEngine::readEndian(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose) {
+	return new Common::SeekableSubReadStreamEndian(
+		stream,
+		0,
+		stream->size(),
+		_gameDescription->platform == Common::kPlatformAmiga,
+		dispose
+	);
+}
+
 void TrecisionEngine::loadAll() {
 	Common::File dataNl;
+
 	if (!dataNl.open("DATA.NL"))
 		error("loadAll : Couldn't open DATA.NL");
+	Common::SeekableReadStreamEndian *data = readEndian(&dataNl, DisposeAfterUse::NO);
 
 	for (int i = 0; i < MAXROOMS; ++i)
-		_room[i].loadRoom(&dataNl);
+		_room[i].loadRoom(data);
 
 	for (int i = 0; i < MAXOBJ; ++i)
-		_obj[i].loadObj(&dataNl);
+		_obj[i].loadObj(data);
 
 	for (int i = 0; i < MAXINVENTORY; ++i)
-		_inventoryObj[i].loadObj(&dataNl);
+		_inventoryObj[i].loadObj(data);
 
-	_soundMgr->loadSamples(&dataNl);
+	_soundMgr->loadSamples(data);
 
 	for (int i = 0; i < MAXSCRIPTFRAME; ++i) {
-		_scriptFrame[i]._class = dataNl.readByte();
-		_scriptFrame[i]._event = dataNl.readByte();
-		_scriptFrame[i]._u8Param = dataNl.readByte();
-		dataNl.readByte(); // Padding
-		_scriptFrame[i]._u16Param1 = dataNl.readUint16LE();
-		_scriptFrame[i]._u16Param2 = dataNl.readUint16LE();
-		_scriptFrame[i]._u32Param = dataNl.readUint16LE();
-		_scriptFrame[i]._noWait = !(dataNl.readSint16LE() == 0);
+		_scriptFrame[i]._class = data->readByte();
+		_scriptFrame[i]._event = data->readByte();
+		_scriptFrame[i]._u8Param = data->readByte();
+		data->readByte(); // Padding
+		_scriptFrame[i]._u16Param1 = data->readUint16();
+		_scriptFrame[i]._u16Param2 = data->readUint16();
+		_scriptFrame[i]._u32Param = data->readUint16();
+		_scriptFrame[i]._noWait = !(data->readSint16() == 0);
 	}
 
 	for (int i = 0; i < MAXSCRIPT; ++i) {
-		_scriptFirstFrame[i] = dataNl.readUint16LE();
-		dataNl.readByte(); // unused field
-		dataNl.readByte(); // Padding
+		_scriptFirstFrame[i] = data->readUint16();
+		data->readByte(); // unused field
+		data->readByte(); // Padding
 	}
 
-	_animMgr->loadAnimTab(&dataNl);
-	_dialogMgr->loadData(&dataNl);
+	_animMgr->loadAnimTab(data);
+	_dialogMgr->loadData(data);
 
-	dataNl.skip(620);	// actions (unused)
+	data->skip(620);	// actions (unused)
 
-	int numFileRef = dataNl.readSint32LE();
-	dataNl.skip(numFileRef * (12 + 4));	// fileRef name + offset
+	int numFileRef = data->readSint32();
+	data->skip(numFileRef * (12 + 4));	// fileRef name + offset
 
 	_textArea = new char[MAXTEXTAREA];
-	dataNl.read(_textArea, MAXTEXTAREA);
+	data->read(_textArea, MAXTEXTAREA);
 
 	_textPtr = _textArea;
 
@@ -99,6 +108,7 @@ void TrecisionEngine::loadAll() {
 	for (int a = 0; a < MAXSYSTEXT; a++)
 		_sysText[a] = getNextSentence();
 
+	delete data;
 	dataNl.close();
 }
 
@@ -115,7 +125,7 @@ byte *TrecisionEngine::readData(const Common::String &fileName) {
 }
 
 void TrecisionEngine::read3D(const Common::String &filename) {
-	Common::SeekableReadStream *ff = _dataFile.createReadStreamForMember(filename);
+	Common::SeekableReadStreamEndian *ff = readEndian(_dataFile.createReadStreamForMember(filename));
 	if (ff == nullptr)
 		error("read3D: Can't open 3D file %s", filename.c_str());
 
@@ -133,7 +143,7 @@ void TrecisionEngine::read3D(const Common::String &filename) {
 	_renderer->setClipping(0, TOP, MAXX, AREA + TOP);
 }
 
-void TrecisionEngine::readObject(Common::SeekableReadStream *stream, uint16 objIndex, uint16 objectId) {
+void TrecisionEngine::readObject(Common::SeekableReadStreamEndian *stream, uint16 objIndex, uint16 objectId) {
 	SObject *obj = &_obj[objectId];
 
 	if (obj->isModeFull()) {
@@ -143,7 +153,7 @@ void TrecisionEngine::readObject(Common::SeekableReadStream *stream, uint16 objI
 		delete[] _objPointers[objIndex];
 		_objPointers[objIndex] = new uint16[size];
 		for (uint32 i = 0; i < size; ++i)
-			_objPointers[objIndex][i] = stream->readUint16LE();
+			_objPointers[objIndex][i] = stream->readUint16();
 
 		_graphicsMgr->updatePixelFormat(_objPointers[objIndex], size);
 	}
@@ -151,15 +161,15 @@ void TrecisionEngine::readObject(Common::SeekableReadStream *stream, uint16 objI
 	if (obj->isModeMask()) {
 		obj->readRect(stream);
 
-		uint32 size = stream->readUint32LE();
+		uint32 size = stream->readUint32();
 		delete[] _objPointers[objIndex];
 		_objPointers[objIndex] = new uint16[size];
 		for (uint32 i = 0; i < size; ++i)
-			_objPointers[objIndex][i] = stream->readUint16LE();
+			_objPointers[objIndex][i] = stream->readUint16();
 
 		_graphicsMgr->updatePixelFormat(_objPointers[objIndex], size);
 
-		size = stream->readUint32LE();
+		size = stream->readUint32();
 		delete[] _maskPointers[objIndex];
 		_maskPointers[objIndex] = new uint8[size];
 		for (uint32 i = 0; i < size; ++i)
@@ -169,7 +179,7 @@ void TrecisionEngine::readObject(Common::SeekableReadStream *stream, uint16 objI
 	refreshObject(objectId);
 }
 
-void TrecisionEngine::readObj(Common::SeekableReadStream *stream) {
+void TrecisionEngine::readObj(Common::SeekableReadStreamEndian *stream) {
 	if (!_room[_curRoom]._object[0])
 		return;
 
@@ -192,7 +202,7 @@ void TrecisionEngine::readExtraObj2C() {
 	if (!_room[_curRoom]._object[32])
 		return;
 
-	Common::SeekableReadStream *ff = _dataFile.createReadStreamForMember("2c2.bm");
+	Common::SeekableReadStreamEndian *ff = readEndian(_dataFile.createReadStreamForMember("2c2.bm"));
 
 	for (uint16 objIndex = PATCHOBJ_ROOM2C; objIndex < MAXOBJINROOM; objIndex++) {
 		const uint16 objectId = _room[_curRoom]._object[objIndex];
@@ -209,7 +219,7 @@ void TrecisionEngine::readExtraObj41D() {
 	if (!_room[_curRoom]._object[32])
 		return;
 
-	Common::SeekableReadStream *ff = _dataFile.createReadStreamForMember("41d2.bm");
+	Common::SeekableReadStreamEndian *ff = readEndian(_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/sound.cpp b/engines/trecision/sound.cpp
index a610f07197..f6a5c97fcb 100644
--- a/engines/trecision/sound.cpp
+++ b/engines/trecision/sound.cpp
@@ -266,13 +266,13 @@ void SoundManager::loadRoomSounds() {
 	}
 }
 
-void SoundManager::loadSamples(Common::File *file) {
+void SoundManager::loadSamples(Common::SeekableReadStreamEndian *stream) {
 	for (int i = 0; i < NUMSAMPLES; ++i) {
 		for (int j = 0; j < 14; j++)
-			_gSample[i]._name += file->readByte();
-		_gSample[i]._volume = file->readByte();
-		_gSample[i]._flag = file->readByte();
-		_gSample[i]._panning = file->readSByte();
+			_gSample[i]._name += stream->readByte();
+		_gSample[i]._volume = stream->readByte();
+		_gSample[i]._flag = stream->readByte();
+		_gSample[i]._panning = stream->readSByte();
 	}
 }
 
diff --git a/engines/trecision/sound.h b/engines/trecision/sound.h
index fc006c5911..fd6bdb9c28 100644
--- a/engines/trecision/sound.h
+++ b/engines/trecision/sound.h
@@ -24,7 +24,7 @@
 #define TRECISION_SOUND_H
 
 #include "trecision/fastfile.h"
-#include "common/file.h"
+#include "common/stream.h"
 #include "audio/mixer.h"
 #include "audio/audiostream.h"
 
@@ -80,7 +80,7 @@ public:
 	int32 talkStart(const Common::String &name);
 	void loadRoomSounds();
 
-	void loadSamples(Common::File *file);
+	void loadSamples(Common::SeekableReadStreamEndian *stream);
 };
 
 
diff --git a/engines/trecision/struct.cpp b/engines/trecision/struct.cpp
index d06acf054c..3f5a78d683 100644
--- a/engines/trecision/struct.cpp
+++ b/engines/trecision/struct.cpp
@@ -24,17 +24,17 @@
 
 namespace Trecision {
 
-void SRoom::loadRoom(Common::File *file) {
-	file->read(&_baseName, 4);
-	_flag = file->readByte();
-	file->readByte(); // Padding
-	_bkgAnim = file->readUint16LE();
+void SRoom::loadRoom(Common::SeekableReadStreamEndian *stream) {
+	stream->read(&_baseName, 4);
+	_flag = stream->readByte();
+	stream->readByte(); // Padding
+	_bkgAnim = stream->readUint16();
 	for (int j = 0; j < MAXOBJINROOM; ++j)
-		_object[j] = file->readUint16LE();
+		_object[j] = stream->readUint16();
 	for (int j = 0; j < MAXSOUNDSINROOM; ++j)
-		_sounds[j] = file->readUint16LE();
+		_sounds[j] = stream->readUint16();
 	for (int j = 0; j < MAXACTIONINROOM; ++j)
-		_actions[j] = file->readUint16LE();
+		_actions[j] = stream->readUint16();
 }
 
 void SRoom::syncGameStream(Common::Serializer &ser) {
@@ -47,11 +47,11 @@ void SRoom::syncGameStream(Common::Serializer &ser) {
 
 /********************************************************************/
 
-void SObject::readRect(Common::SeekableReadStream *stream) {
-	_rect.left = stream->readUint16LE();
-	_rect.top = stream->readUint16LE();
-	_rect.setWidth(stream->readUint16LE());
-	_rect.setHeight(stream->readUint16LE());
+void SObject::readRect(Common::SeekableReadStreamEndian *stream) {
+	_rect.left = stream->readUint16();
+	_rect.top = stream->readUint16();
+	_rect.setWidth(stream->readUint16());
+	_rect.setHeight(stream->readUint16());
 }
 
 void SObject::syncGameStream(Common::Serializer &ser) {
@@ -71,31 +71,31 @@ void SObject::syncGameStream(Common::Serializer &ser) {
 	ser.syncAsSByte(_position);
 }
 
-void SObject::loadObj(Common::File *file) {
-	uint16 w = file->readUint16LE();
-	uint16 h = file->readUint16LE();
-	_rect.left = file->readUint16LE();
-	_rect.top = file->readUint16LE();
+void SObject::loadObj(Common::SeekableReadStreamEndian *stream) {
+	uint16 w = stream->readUint16();
+	uint16 h = stream->readUint16();
+	_rect.left = stream->readUint16();
+	_rect.top = stream->readUint16();
 	_rect.setWidth(w);
 	_rect.setHeight(h);
 
-	_lim.left = file->readUint16LE();
-	_lim.top = file->readUint16LE();
-	_lim.right = file->readUint16LE();
-	_lim.bottom = file->readUint16LE();
-
-	_position = file->readSByte();
-	file->readByte(); // Padding
-	_name = file->readUint16LE();
-	_examine = file->readUint16LE();
-	_action = file->readUint16LE();
-	_goRoom = file->readByte();
-	_nbox = file->readByte();
-	_ninv = file->readByte();
-	_mode = file->readByte();
-	_flag = file->readByte();
-	file->readByte(); // Padding
-	_anim = file->readUint16LE();
+	_lim.left = stream->readUint16();
+	_lim.top = stream->readUint16();
+	_lim.right = stream->readUint16();
+	_lim.bottom = stream->readUint16();
+
+	_position = stream->readSByte();
+	stream->readByte(); // Padding
+	_name = stream->readUint16();
+	_examine = stream->readUint16();
+	_action = stream->readUint16();
+	_goRoom = stream->readByte();
+	_nbox = stream->readByte();
+	_ninv = stream->readByte();
+	_mode = stream->readByte();
+	_flag = stream->readByte();
+	stream->readByte(); // Padding
+	_anim = stream->readUint16();
 }
 
 /********************************************************************/
@@ -108,13 +108,13 @@ void SInvObject::syncGameStream(Common::Serializer &ser) {
 	ser.syncAsByte(_flag);
 }
 
-void SInvObject::loadObj(Common::File *file) {
-	_name = file->readUint16LE();
-	_examine = file->readUint16LE();
-	_action = file->readUint16LE();
-	_flag = file->readByte();
-	file->readByte(); // Padding
-	_anim = file->readUint16LE();
+void SInvObject::loadObj(Common::SeekableReadStreamEndian *stream) {
+	_name = stream->readUint16();
+	_examine = stream->readUint16();
+	_action = stream->readUint16();
+	_flag = stream->readByte();
+	stream->readByte(); // Padding
+	_anim = stream->readUint16();
 }
 
 /********************************************************************/
diff --git a/engines/trecision/struct.h b/engines/trecision/struct.h
index 4265a7e70b..93c98b1d04 100644
--- a/engines/trecision/struct.h
+++ b/engines/trecision/struct.h
@@ -23,7 +23,7 @@
 #ifndef TRECISION_STRUCT_H
 #define TRECISION_STRUCT_H
 
-#include "common/file.h"
+#include "common/stream.h"
 #include "common/rect.h"
 #include "common/scummsys.h"
 #include "common/serializer.h"
@@ -45,7 +45,7 @@ struct SRoom {
 	void setDone(bool on) { if (on) _flag |= kObjFlagDone; else _flag &= ~kObjFlagDone; }
 
 	void syncGameStream(Common::Serializer &ser);
-	void loadRoom(Common::File *file);
+	void loadRoom(Common::SeekableReadStreamEndian *stream);
 
 private:
 	uint8 _flag = 0; // Room visited or not, extra or not
@@ -63,7 +63,7 @@ struct SObject {
 	uint8 _ninv;                            // ptr inventory
 	uint16 _anim;
 	
-	void readRect(Common::SeekableReadStream *stream);
+	void readRect(Common::SeekableReadStreamEndian *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; }
@@ -94,7 +94,7 @@ struct SObject {
 	void setModeStatus(bool on) { if (on) _mode |= OBJMODE_OBJSTATUS; else _mode &= ~OBJMODE_OBJSTATUS; }
 	
 	void syncGameStream(Common::Serializer &ser);
-	void loadObj(Common::File *file);
+	void loadObj(Common::SeekableReadStreamEndian *stream);
 
 private:
 	uint8 _flag = 0;
@@ -113,7 +113,7 @@ struct SInvObject {
 	bool isUseWith() { return _flag & kObjFlagUseWith; }
 
 	void syncGameStream(Common::Serializer &ser);
-	void loadObj(Common::File *file);
+	void loadObj(Common::SeekableReadStreamEndian *stream);
 
 private:
 	uint8 _flag = 0;
diff --git a/engines/trecision/trecision.cpp b/engines/trecision/trecision.cpp
index 3a5f2e0f62..9e8afac5e1 100644
--- a/engines/trecision/trecision.cpp
+++ b/engines/trecision/trecision.cpp
@@ -233,10 +233,6 @@ Common::Error TrecisionEngine::run() {
 	return Common::kNoError;
 }
 
-bool TrecisionEngine::isDemo() const {
-	return _gameDescription->flags & ADGF_DEMO;
-}
-
 void TrecisionEngine::eventLoop() {
 	Common::Event event;
 	while (g_system->getEventManager()->pollEvent(event)) {
@@ -381,7 +377,7 @@ void TrecisionEngine::readLoc() {
 	_graphicsMgr->clearScreenBufferTop();
 
 	Common::String filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
-	Common::SeekableReadStream *picFile = _dataFile.createReadStreamForCompressedMember(filename);
+	Common::SeekableReadStreamEndian *picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
 
 	SObject bgInfo;
 	bgInfo.readRect(picFile);
@@ -432,7 +428,7 @@ void TrecisionEngine::redrawRoom() {
 	}
 
 	Common::String filename = Common::String::format("%s.cr", _room[_curRoom]._baseName);
-	Common::SeekableReadStream *picFile = _dataFile.createReadStreamForCompressedMember(filename);
+	Common::SeekableReadStreamEndian *picFile = readEndian(_dataFile.createReadStreamForCompressedMember(filename));
 
 	SObject bgInfo;
 	bgInfo.readRect(picFile);
diff --git a/engines/trecision/trecision.h b/engines/trecision/trecision.h
index c5fc1c5ff2..cec8a6f2da 100644
--- a/engines/trecision/trecision.h
+++ b/engines/trecision/trecision.h
@@ -27,6 +27,7 @@
 #include "common/keyboard.h"
 #include "common/str.h"
 #include "common/serializer.h"
+#include "common/stream.h"
 #include "engines/advancedDetector.h"
 #include "engines/engine.h"
 #include "graphics/surface.h"
@@ -134,8 +135,8 @@ class TrecisionEngine : public Engine {
 	bool canPlayerInteract();
 
 	// Objects
-	void readObj(Common::SeekableReadStream *stream);
-	void readObject(Common::SeekableReadStream *stream, uint16 objIndex, uint16 objectId);
+	void readObj(Common::SeekableReadStreamEndian *stream);
+	void readObject(Common::SeekableReadStreamEndian *stream, uint16 objIndex, uint16 objectId);
 
 	char *_textArea;
 	uint16 _curScriptFrame[10];
@@ -154,7 +155,7 @@ public:
 
 	// ScummVM
 	Common::Error run() override;
-	bool isDemo() const;
+	bool isDemo() const { return _gameDescription->flags & ADGF_DEMO; }
 	bool hasFeature(EngineFeature f) const override;
 	bool canLoadGameStateCurrently() override { return canPlayerInteract() && _curRoom != kRoomIntro; }
 	bool canSaveGameStateCurrently() override { return canPlayerInteract() && _curRoom != kRoomIntro; }
@@ -163,6 +164,7 @@ public:
 	bool syncGameStream(Common::Serializer &ser);
 
 	// Data files
+	Common::SeekableReadStreamEndian *readEndian(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::YES);
 	void read3D(const Common::String &c);
 
 	// Inventory
diff --git a/engines/trecision/video.cpp b/engines/trecision/video.cpp
index 55086b06c7..96ed763cc2 100644
--- a/engines/trecision/video.cpp
+++ b/engines/trecision/video.cpp
@@ -551,27 +551,27 @@ void AnimManager::syncGameStream(Common::Serializer &ser) {
 	}
 }
 
-void AnimManager::loadAnimTab(Common::File *file) {
+void AnimManager::loadAnimTab(Common::SeekableReadStreamEndian *stream) {
 	for (uint16 i = 0; i < MAXANIM; ++i) {
-		file->read(&_animTab[i]._name, 14);
+		stream->read(&_animTab[i]._name, 14);
 
-		_animTab[i]._flag = file->readUint16LE();
+		_animTab[i]._flag = stream->readUint16();
 
 		for (uint8 j = 0; j < MAXCHILD; ++j) {
-			_animTab[i]._lim[j].left = file->readUint16LE();
-			_animTab[i]._lim[j].top = file->readUint16LE();
-			_animTab[i]._lim[j].right = file->readUint16LE();
-			_animTab[i]._lim[j].bottom = file->readUint16LE();
+			_animTab[i]._lim[j].left = stream->readUint16();
+			_animTab[i]._lim[j].top = stream->readUint16();
+			_animTab[i]._lim[j].right = stream->readUint16();
+			_animTab[i]._lim[j].bottom = stream->readUint16();
 		}
 
-		_animTab[i]._nbox = file->readByte();
-		file->readByte(); // Padding
+		_animTab[i]._nbox = stream->readByte();
+		stream->readByte(); // Padding
 
 		for (uint8 j = 0; j < MAXATFRAME; ++j) {
-			_animTab[i]._atFrame[j]._type = file->readByte();
-			_animTab[i]._atFrame[j]._child = file->readByte();
-			_animTab[i]._atFrame[j]._numFrame = file->readUint16LE();
-			_animTab[i]._atFrame[j]._index = file->readUint16LE();
+			_animTab[i]._atFrame[j]._type = stream->readByte();
+			_animTab[i]._atFrame[j]._child = stream->readByte();
+			_animTab[i]._atFrame[j]._numFrame = stream->readUint16();
+			_animTab[i]._atFrame[j]._index = stream->readUint16();
 		}
 	}
 }
diff --git a/engines/trecision/video.h b/engines/trecision/video.h
index d414dc8044..4807fcfb7e 100644
--- a/engines/trecision/video.h
+++ b/engines/trecision/video.h
@@ -23,7 +23,7 @@
 #ifndef TRECISION_VIDEO_H
 #define TRECISION_VIDEO_H
 
-#include "common/file.h"
+#include "common/stream.h"
 #include "common/serializer.h"
 #include "video/smk_decoder.h"
 
@@ -110,7 +110,7 @@ public:
 	void stopAllSmkAnims();
 
 	void syncGameStream(Common::Serializer &ser);
-	void loadAnimTab(Common::File *file);
+	void loadAnimTab(Common::SeekableReadStreamEndian *stream);
 };
 } // End of namespace Trecision
 #endif


Commit: c8be95585cdf895a02201973ac8dde8b46d01a63
    https://github.com/scummvm/scummvm/commit/c8be95585cdf895a02201973ac8dde8b46d01a63
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:05+01:00

Commit Message:
TRECISION: Amiga uses raw audio format

Changed paths:
    engines/trecision/resource.cpp
    engines/trecision/sound.cpp
    engines/trecision/sound.h
    engines/trecision/trecision.h


diff --git a/engines/trecision/resource.cpp b/engines/trecision/resource.cpp
index 043188b4f9..68cac589e9 100644
--- a/engines/trecision/resource.cpp
+++ b/engines/trecision/resource.cpp
@@ -42,13 +42,7 @@
 namespace Trecision {
 
 Common::SeekableReadStreamEndian *TrecisionEngine::readEndian(Common::SeekableReadStream *stream, DisposeAfterUse::Flag dispose) {
-	return new Common::SeekableSubReadStreamEndian(
-		stream,
-		0,
-		stream->size(),
-		_gameDescription->platform == Common::kPlatformAmiga,
-		dispose
-	);
+	return new Common::SeekableSubReadStreamEndian(stream, 0, stream->size(), isAmiga(), dispose);
 }
 
 void TrecisionEngine::loadAll() {
diff --git a/engines/trecision/sound.cpp b/engines/trecision/sound.cpp
index f6a5c97fcb..b95068e737 100644
--- a/engines/trecision/sound.cpp
+++ b/engines/trecision/sound.cpp
@@ -23,6 +23,7 @@
 #include "audio/audiostream.h"
 #include "audio/mixer.h"
 #include "audio/decoders/wave.h"
+#include "audio/decoders/raw.h"
 #include "common/scummsys.h"
 #include "common/system.h"
 
@@ -46,6 +47,14 @@ SoundManager::~SoundManager() {
 	stopAll();
 }
 
+Audio::SeekableAudioStream *SoundManager::loadWAV(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
+	if (_vm->isAmiga()) {
+		return Audio::makeRawStream(stream, 11025, 0, disposeAfterUse);
+	} else {
+		return Audio::makeWAVStream(stream, disposeAfterUse);
+	}
+}
+
 void SoundManager::play(int soundId) {
 	SRoom *curRoom = &_vm->_room[_vm->_curRoom];
 
@@ -77,9 +86,9 @@ void SoundManager::play(int soundId) {
 			Audio::AudioStream *stream = nullptr;
 
 			if (_gSample[soundId]._flag & kSoundFlagSoundLoop)
-				stream = Audio::makeLoopingAudioStream(Audio::makeWAVStream(memStream, DisposeAfterUse::YES), 0);
+				stream = Audio::makeLoopingAudioStream(loadWAV(memStream), 0);
 			else
-				stream = Audio::makeWAVStream(memStream, DisposeAfterUse::YES);
+				stream = loadWAV(memStream);
 
 			g_system->getMixer()->playStream(
 				type,
@@ -181,7 +190,7 @@ void SoundManager::soundStep(int midx, int midz, int act, int frame) {
 		if (stepRight && (_gSample[soundId]._flag & kSoundFlagStepRight)) {
 			if (!_stepRightStream) {
 				Common::SeekableReadStream *soundFileStream = _vm->_dataFile.createReadStreamForMember(_gSample[soundId]._name);
-				_stepRightStream = Audio::makeWAVStream(soundFileStream, DisposeAfterUse::YES);
+				_stepRightStream = loadWAV(soundFileStream);
 			}
 			break;
 		}
@@ -189,7 +198,7 @@ void SoundManager::soundStep(int midx, int midz, int act, int frame) {
 		if (stepLeft && (_gSample[soundId]._flag & kSoundFlagStepLeft)) {
 			if (!_stepLeftStream) {
 				Common::SeekableReadStream *soundFileStream = _vm->_dataFile.createReadStreamForMember(_gSample[soundId]._name);
-				_stepLeftStream = Audio::makeWAVStream(soundFileStream, DisposeAfterUse::YES);
+				_stepLeftStream = loadWAV(soundFileStream);
 			}
 			break;
 		}
@@ -231,7 +240,7 @@ int32 SoundManager::talkStart(const Common::String &name) {
 	if (!stream)
 		return 0;
 
-	Audio::SeekableAudioStream *audioStream = Audio::makeWAVStream(stream, DisposeAfterUse::YES);
+	Audio::SeekableAudioStream *audioStream = loadWAV(stream);
 
 	g_system->getMixer()->playStream(
 		Audio::Mixer::kSpeechSoundType,
diff --git a/engines/trecision/sound.h b/engines/trecision/sound.h
index fd6bdb9c28..6ee7ccbbba 100644
--- a/engines/trecision/sound.h
+++ b/engines/trecision/sound.h
@@ -72,6 +72,7 @@ private:
 	Audio::SeekableAudioStream *_stepRightStream;
 
 public:
+	Audio::SeekableAudioStream *loadWAV(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
 	void play(int soundId);
 	void stopSoundType(SoundType type);
 	void stopAll();
diff --git a/engines/trecision/trecision.h b/engines/trecision/trecision.h
index cec8a6f2da..68337f829e 100644
--- a/engines/trecision/trecision.h
+++ b/engines/trecision/trecision.h
@@ -156,6 +156,7 @@ public:
 	// ScummVM
 	Common::Error run() override;
 	bool isDemo() const { return _gameDescription->flags & ADGF_DEMO; }
+	bool isAmiga() const { return _gameDescription->platform == Common::kPlatformAmiga; }
 	bool hasFeature(EngineFeature f) const override;
 	bool canLoadGameStateCurrently() override { return canPlayerInteract() && _curRoom != kRoomIntro; }
 	bool canSaveGameStateCurrently() override { return canPlayerInteract() && _curRoom != kRoomIntro; }


Commit: 48b9f54bfc58de4ef1a231f747799ad26fccfd61
    https://github.com/scummvm/scummvm/commit/48b9f54bfc58de4ef1a231f747799ad26fccfd61
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:05+01:00

Commit Message:
COMMON: Add support for fixed-size strings in ReadStream::readString

Changed paths:
    common/stream.cpp
    common/stream.h


diff --git a/common/stream.cpp b/common/stream.cpp
index 437d68e74e..d78bb4e122 100644
--- a/common/stream.cpp
+++ b/common/stream.cpp
@@ -52,13 +52,21 @@ SeekableReadStream *ReadStream::readStream(uint32 dataSize) {
 	return new MemoryReadStream((byte *)buf, dataSize, DisposeAfterUse::YES);
 }
 
-Common::String ReadStream::readString(char terminator) {
+Common::String ReadStream::readString(char terminator, size_t len) {
 	Common::String result;
 	char c;
 
-	while ((c = (char)readByte()) != terminator && !eos())
+	while ((c = (char)readByte()) != terminator && result.size() < len && !eos())
 		result += c;
 
+	// If the string terminated early, skip the remaining bytes
+	if (!eos() && len != Common::String::npos && result.size() < len - 1) {
+		size_t skipBytes = len - result.size() - 1; // skip terminator
+		for (size_t i = 0; i < skipBytes; i++) {
+			readByte();
+		}
+	}
+
 	return result;
 }
 
diff --git a/common/stream.h b/common/stream.h
index 082ec3d6b8..071d41bd0c 100644
--- a/common/stream.h
+++ b/common/stream.h
@@ -643,8 +643,9 @@ public:
 	 * the terminating character.
 	 *
 	 * @param terminator	The terminating character to use.
+	 * @param len			The maximum length to read (includes terminator).
 	 */
-	String readString(char terminator = 0);
+	String readString(char terminator = 0, size_t len = String::npos);
 
 	/**
 	 * Read a string in Pascal format, that is, one byte is


Commit: 62f62b6b620051ec8e9d512175a15cc335e9f3a7
    https://github.com/scummvm/scummvm/commit/62f62b6b620051ec8e9d512175a15cc335e9f3a7
Author: SupSuper (supsuper at gmail.com)
Date: 2021-05-31T06:40:06+01:00

Commit Message:
TRECISION: Add endianness to FastFile

Changed paths:
    engines/trecision/fastfile.cpp
    engines/trecision/fastfile.h
    engines/trecision/saveload.cpp
    engines/trecision/sound.cpp
    engines/trecision/trecision.cpp
    engines/trecision/video.cpp


diff --git a/engines/trecision/fastfile.cpp b/engines/trecision/fastfile.cpp
index b239185e76..d403b30a1a 100644
--- a/engines/trecision/fastfile.cpp
+++ b/engines/trecision/fastfile.cpp
@@ -46,20 +46,19 @@ const FileEntry *FastFile::getEntry(const Common::String &name) const {
 	return nullptr;
 }
 
-bool FastFile::open(const Common::String &name) {
+bool FastFile::open(TrecisionEngine *vm, const Common::String &name) {
 	close();
 
-	_stream = SearchMan.createReadStreamForMember(name);
+	_stream = vm->readEndian(SearchMan.createReadStreamForMember(name));
 	if (!_stream)
 		return false;
 
-	int numFiles = _stream->readUint32LE();
+	int numFiles = _stream->readUint32();
 	_fileEntries.resize(numFiles);
 	for (int i = 0; i < numFiles; ++i) {
 		FileEntry *entry = &_fileEntries[i];
-		for (int j = 0; j < 12; ++j)
-			entry->name += _stream->readByte();
-		entry->offset = _stream->readUint32LE();
+		entry->name = _stream->readString(0, 12);
+		entry->offset = _stream->readUint32();
 	}
 
 	return true;
diff --git a/engines/trecision/fastfile.h b/engines/trecision/fastfile.h
index b023a608d5..2fcdea3540 100644
--- a/engines/trecision/fastfile.h
+++ b/engines/trecision/fastfile.h
@@ -29,6 +29,8 @@
 
 namespace Trecision {
 
+class TrecisionEngine;
+
 struct FileEntry {
 	Common::String name;
 	uint32 offset;
@@ -39,7 +41,7 @@ public:
 	FastFile();
 	~FastFile() override;
 
-	bool open(const Common::String &filename);
+	bool open(TrecisionEngine *vm, const Common::String &filename);
 	void close();
 	bool isOpen() const { return _stream != 0; }
 	Common::SeekableReadStream *createReadStreamForCompressedMember(const Common::String &name);
@@ -51,7 +53,7 @@ public:
 	Common::SeekableReadStream *createReadStreamForMember(const Common::String &name) const override;
 
 private:
-	Common::SeekableReadStream *_stream;
+	Common::SeekableReadStreamEndian *_stream;
 	Common::SeekableReadStream *_compStream;
 	Common::Array<FileEntry> _fileEntries;
 
diff --git a/engines/trecision/saveload.cpp b/engines/trecision/saveload.cpp
index f09d2f430f..bc93258fe4 100644
--- a/engines/trecision/saveload.cpp
+++ b/engines/trecision/saveload.cpp
@@ -54,17 +54,7 @@ void TrecisionEngine::loadSaveSlots(Common::StringArray &saveNames) {
 
 		if (version >= SAVE_VERSION_ORIGINAL_MIN && version <= SAVE_VERSION_ORIGINAL_MAX) {
 			// Original saved game, convert
-			Common::String saveName;
-			int j = 0;
-			for (; j < 40; j++) {
-				byte c = saveFile->readByte();
-				if (c == 0) {
-					break;
-				} else {
-					saveName += c;
-				}
-			}
-			saveFile->skip(40 - j + 1);
+			Common::String saveName = saveFile->readString(0, 40);
 			saveNames.push_back(saveName);
 
 			_inventory.push_back(EMPTYSLOT + i + 1);
diff --git a/engines/trecision/sound.cpp b/engines/trecision/sound.cpp
index b95068e737..a038bea76f 100644
--- a/engines/trecision/sound.cpp
+++ b/engines/trecision/sound.cpp
@@ -34,7 +34,7 @@
 namespace Trecision {
 
 SoundManager::SoundManager(TrecisionEngine *vm) : _vm(vm) {
-	if (!_speechFile.open("nlspeech.cd0"))
+	if (!_speechFile.open(_vm, "nlspeech.cd0"))
 		warning("SoundManager - nlspeech.cd0 is missing - skipping");
 
 	_stepLeftStream = nullptr;
diff --git a/engines/trecision/trecision.cpp b/engines/trecision/trecision.cpp
index 9e8afac5e1..c444637d47 100644
--- a/engines/trecision/trecision.cpp
+++ b/engines/trecision/trecision.cpp
@@ -190,7 +190,7 @@ TrecisionEngine::~TrecisionEngine() {
 Common::Error TrecisionEngine::run() {
 	syncSoundSettings();
 
-	if (!_dataFile.open("nldata.cd0"))
+	if (!_dataFile.open(this, "nldata.cd0"))
 		error("Error opening nldata.cd0");
 
 	_graphicsMgr = new GraphicsManager(this);
diff --git a/engines/trecision/video.cpp b/engines/trecision/video.cpp
index 96ed763cc2..cd96b5778d 100644
--- a/engines/trecision/video.cpp
+++ b/engines/trecision/video.cpp
@@ -525,7 +525,7 @@ void AnimManager::swapCD(int cd) {
 	Common::String animFileName = Common::String::format("nlanim.cd%d", cd);
 	for (uint8 i = 0; i < MAXSMACK; ++i) {
 		_animFile[i].close();
-		_animFile[i].open(animFileName);
+		_animFile[i].open(_vm, animFileName);
 	}
 }
 




More information about the Scummvm-git-logs mailing list