[Scummvm-git-logs] scummvm master -> edd63137ab9cb7146b2f413cef9600af9122e224

antoniou79 antoniou at cti.gr
Thu Jun 20 09:25:51 CEST 2019


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

Summary:
e6c61ff67b BLADERUNNER: Fix crash in restored mode with CDFRAMESx.DAT
edd63137ab BLADERUNNER: Try and close all TLK on shutdown always


Commit: e6c61ff67b8600fa2cc7d7f894d96fec0d99a11a
    https://github.com/scummvm/scummvm/commit/e6c61ff67b8600fa2cc7d7f894d96fec0d99a11a
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-06-20T10:12:16+03:00

Commit Message:
BLADERUNNER: Fix crash in restored mode with CDFRAMESx.DAT

Changed paths:
    engines/bladerunner/slice_animations.cpp
    engines/bladerunner/slice_animations.h


diff --git a/engines/bladerunner/slice_animations.cpp b/engines/bladerunner/slice_animations.cpp
index f4fc134..15a5a50 100644
--- a/engines/bladerunner/slice_animations.cpp
+++ b/engines/bladerunner/slice_animations.cpp
@@ -86,17 +86,27 @@ bool SliceAnimations::open(const Common::String &name) {
 SliceAnimations::~SliceAnimations() {
 	for (uint32 i = 0; i != _pages.size(); ++i)
 		free(_pages[i]._data);
+
+	// close open files
+	_coreAnimPageFile.close(0);
+	if (!_vm->_cutContent) {
+		_framesPageFile.close(_framesPageFile._fileNumber);
+	} else {
+		for (uint i = 0; i < 5; ++i) {
+			_framesPageFile.close(i);
+		}
+	}
 }
 
 bool SliceAnimations::openCoreAnim() {
-	return _coreAnimPageFile.open("COREANIM.DAT");
+	return _coreAnimPageFile.open("COREANIM.DAT", 0);
 }
 
 bool SliceAnimations::openFrames(int fileNumber) {
 
 	if (_framesPageFile._fileNumber == -1) { // Running for the first time, need to probe
 		// First, try HDFRAMES.DAT
-		if (_framesPageFile.open("HDFRAMES.DAT")) {
+		if (_framesPageFile.open("HDFRAMES.DAT", 0)) {
 			_framesPageFile._fileNumber = 0;
 
 			return true;
@@ -108,43 +118,82 @@ bool SliceAnimations::openFrames(int fileNumber) {
 	if (_framesPageFile._fileNumber == 0) // HDFRAMES.DAT
 		return true;
 
-	if (_framesPageFile._fileNumber == fileNumber)
+	if (!_vm->_cutContent && _framesPageFile._fileNumber == fileNumber)
 		return true;
 
-	_framesPageFile.close();
-
-	_framesPageFile._fileNumber = fileNumber;
-
-	if (fileNumber == 1 && _framesPageFile.open("CDFRAMES.DAT")) {// For Chapter1 we try both CDFRAMES.DAT and CDFRAMES1.DAT
+	if (_vm->_cutContent && _framesPageFile._fileNumber == 5) // all frame files loaded
 		return true;
-	}
 
-	if (_framesPageFile.open(Common::String::format("CDFRAMES%d.DAT", fileNumber))) {
+	if (!_vm->_cutContent) {
+		// _fileNumber can normally be in [1,4]
+		// but it will be "5" if we switched from restored content to original
+		if (_framesPageFile._fileNumber == 5) {
+			for (uint i = 1; i < 5; ++i) {
+				_framesPageFile.close(i);
+			}
+		} else if (_framesPageFile._fileNumber > 0) {
+			_framesPageFile.close(_framesPageFile._fileNumber);
+		}
+		_framesPageFile._fileNumber = fileNumber;
+		// For Chapter1 we try both CDFRAMES.DAT and CDFRAMES1.DAT
+		if (fileNumber == 1 && _framesPageFile.open("CDFRAMES.DAT", fileNumber)) {
+			return true;
+		}
+
+		if (_framesPageFile.open(Common::String::format("CDFRAMES%d.DAT", fileNumber), fileNumber)) {
+			return true;
+		}
+	} else {
+		// Restored cut content case
+		// open all four CDFRAMESx.DAT files in slots [1,5]
+		// So that all animation resources are available at all times as if we just had the single HDFRAMES.DAT file
+		for (uint i = 1; i < 5; ++i) {
+			_framesPageFile.close(i);
+			if (i == 1
+			    && (!_framesPageFile.open("CDFRAMES.DAT", i))
+			    && (!_framesPageFile.open(Common::String::format("CDFRAMES%d.DAT", i), i))
+			) {
+				// For Chapter1 we try both CDFRAMES.DAT and CDFRAMES1.DAT
+				return false;
+			} else if(i != 1 &&
+			          !_framesPageFile.open(Common::String::format("CDFRAMES%d.DAT", i), i)
+			) {
+				return false;
+			}
+		}
+		_framesPageFile._fileNumber = 5;
 		return true;
 	}
 	return false;
 }
 
-bool SliceAnimations::PageFile::open(const Common::String &name) {
-	if (!_file.open(name))
+bool SliceAnimations::PageFile::open(const Common::String &name, int8 fileIdx) {
+	if (!_files[fileIdx].open(name))
 		return false;
 
-	uint32 timestamp = _file.readUint32LE();
+	uint32 timestamp = _files[fileIdx].readUint32LE();
 	if (timestamp != _sliceAnimations->_timestamp)
 		return false;
 
-	_pageOffsets.resize(_sliceAnimations->_pageCount);
-	for (uint32 i = 0; i != _sliceAnimations->_pageCount; ++i)
-		_pageOffsets[i] = -1;
+	if (!_sliceAnimations->_vm->_cutContent
+		|| (_pageOffsets.size() < _sliceAnimations->_pageCount) ){
+		_pageOffsets.resize(_sliceAnimations->_pageCount);
+		_pageOffsetsFileIdx.resize(_sliceAnimations->_pageCount);
+		for (uint32 i = 0; i != _sliceAnimations->_pageCount; ++i) {
+			_pageOffsets[i] = -1;
+			_pageOffsetsFileIdx[i] = -1;
+		}
+	}
 
-	uint32 pageCount  = _file.readUint32LE();
+	uint32 pageCount  = _files[fileIdx].readUint32LE();
 	uint32 dataOffset = 8 + 4 * pageCount;
 
 	for (uint32 i = 0; i != pageCount; ++i) {
-		uint32 pageNumber = _file.readUint32LE();
+		uint32 pageNumber = _files[fileIdx].readUint32LE();
 		if (pageNumber == 0xffffffff)
 			continue;
 		_pageOffsets[pageNumber] = dataOffset + i * _sliceAnimations->_pageSize;
+		_pageOffsetsFileIdx[pageNumber] = fileIdx;
 	}
 
 	// debug(5, "PageFile::Open: page file \"%s\" opened with %d pages", name.c_str(), pageCount);
@@ -152,23 +201,29 @@ bool SliceAnimations::PageFile::open(const Common::String &name) {
 	return true;
 }
 
-void SliceAnimations::PageFile::close() {
-	if (_file.isOpen()) {
-		_file.close();
+void SliceAnimations::PageFile::close(int8 fileIdx) {
+	if (fileIdx >= 0 && fileIdx < 5) {
+		if (_files[fileIdx].isOpen()) {
+			_files[fileIdx].close();
+		}
 	}
 }
 
 void *SliceAnimations::PageFile::loadPage(uint32 pageNumber) {
-	if (_pageOffsets[pageNumber] == -1)
+	if (_pageOffsets.size() < _sliceAnimations->_pageCount
+	    || _pageOffsetsFileIdx.size() < _sliceAnimations->_pageCount
+	    || _pageOffsets[pageNumber] == -1
+	    || _pageOffsetsFileIdx[pageNumber] == -1) {
 		return nullptr;
+	}
 
 	uint32 pageSize = _sliceAnimations->_pageSize;
 
 	// TODO: Retire oldest pages if we exceed some memory limit
 
 	void *data = malloc(pageSize);
-	_file.seek(_pageOffsets[pageNumber], SEEK_SET);
-	uint32 r = _file.read(data, pageSize);
+	_files[_pageOffsetsFileIdx[pageNumber]].seek(_pageOffsets[pageNumber], SEEK_SET);
+	uint32 r = _files[_pageOffsetsFileIdx[pageNumber]].read(data, pageSize);
 	assert(r == pageSize);
 
 	return data;
diff --git a/engines/bladerunner/slice_animations.h b/engines/bladerunner/slice_animations.h
index 0732e59..79dd646 100644
--- a/engines/bladerunner/slice_animations.h
+++ b/engines/bladerunner/slice_animations.h
@@ -66,13 +66,14 @@ class SliceAnimations {
 	struct PageFile {
 		int                  _fileNumber;
 		SliceAnimations     *_sliceAnimations;
-		Common::File         _file;
+		Common::File         _files[5];
 		Common::Array<int32> _pageOffsets;
+		Common::Array<int8>  _pageOffsetsFileIdx;
 
 		PageFile(SliceAnimations *sliceAnimations) : _sliceAnimations(sliceAnimations), _fileNumber(-1) {}
 
-		bool  open(const Common::String &name);
-		void  close();
+		bool  open(const Common::String &name, int8 fileIdx);
+		void  close(int8 fileIdx);
 		void *loadPage(uint32 page);
 	};
 


Commit: edd63137ab9cb7146b2f413cef9600af9122e224
    https://github.com/scummvm/scummvm/commit/edd63137ab9cb7146b2f413cef9600af9122e224
Author: Thanasis Antoniou (a.antoniou79 at gmail.com)
Date: 2019-06-20T10:12:16+03:00

Commit Message:
BLADERUNNER: Try and close all TLK on shutdown always

Changed paths:
    engines/bladerunner/chapters.cpp


diff --git a/engines/bladerunner/chapters.cpp b/engines/bladerunner/chapters.cpp
index 7cf7c5e..f063801 100644
--- a/engines/bladerunner/chapters.cpp
+++ b/engines/bladerunner/chapters.cpp
@@ -71,14 +71,13 @@ void Chapters::closeResources() {
 	}
 #endif // BLADERUNNER_ORIGINAL_BUGS
 	_vm->closeArchive(Common::String::format("VQA%d.MIX", MIN(id, 3)));
-	if (_vm->_cutContent) {
-		for (int chi = 1; chi < 4; ++chi) {
-			if (_vm->isArchiveOpen(Common::String::format("%d.TLK", chi))) {
-				_vm->closeArchive(Common::String::format("%d.TLK", chi));
-			}
+	// It's better to try and close every TLK file here (if open), since
+	// when switching from Restored Content version to Original (due to a save game load)
+	// TLK files would still remain open -- and should still be closed here
+	for (int chi = 1; chi < 4; ++chi) {
+		if (_vm->isArchiveOpen(Common::String::format("%d.TLK", chi))) {
+			_vm->closeArchive(Common::String::format("%d.TLK", chi));
 		}
-	} else {
-		_vm->closeArchive(Common::String::format("%d.TLK", MIN(id, 3)));
 	}
 	_vm->closeArchive(Common::String::format("OUTTAKE%d.MIX", id));
 	_hasOpenResources = false;





More information about the Scummvm-git-logs mailing list