[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