[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