aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/anifile.cpp
diff options
context:
space:
mode:
authorSven Hesse2012-06-28 22:54:05 +0200
committerSven Hesse2012-07-30 01:44:42 +0200
commit4fc3a88c5f0b053323aeaeac658dafb8e4606662 (patch)
tree0889eb2314c738f713ea2075d06a162bfed70797 /engines/gob/anifile.cpp
parent83896dea3edc3bcfb1e414b61644c7ca266e1cce (diff)
downloadscummvm-rg350-4fc3a88c5f0b053323aeaeac658dafb8e4606662.tar.gz
scummvm-rg350-4fc3a88c5f0b053323aeaeac658dafb8e4606662.tar.bz2
scummvm-rg350-4fc3a88c5f0b053323aeaeac658dafb8e4606662.zip
GOB: Add support for different methods of handling Endianness
The Once Upon A Time games handle endianness different in ANI, DEC and RXY files than Geisha does. We need to support both approaches.
Diffstat (limited to 'engines/gob/anifile.cpp')
-rw-r--r--engines/gob/anifile.cpp34
1 files changed, 21 insertions, 13 deletions
diff --git a/engines/gob/anifile.cpp b/engines/gob/anifile.cpp
index 2671fe0405..e6bf30f4d7 100644
--- a/engines/gob/anifile.cpp
+++ b/engines/gob/anifile.cpp
@@ -37,30 +37,38 @@ ANIFile::ANIFile(GobEngine *vm, const Common::String &fileName,
uint16 width, uint8 bpp) : _vm(vm),
_width(width), _bpp(bpp), _hasPadding(false) {
- Common::SeekableReadStream *ani = _vm->_dataIO->getFile(fileName);
- if (ani) {
- Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), false, DisposeAfterUse::YES);
+ bool bigEndian = false;
+ Common::String endianFileName = fileName;
- load(sub, fileName);
- return;
- }
+ if ((_vm->getEndiannessMethod() == kEndiannessMethodAltFile) &&
+ !_vm->_dataIO->hasFile(fileName)) {
+ // If the game has alternate big-endian files, look if one exist
+
+ Common::String alternateFileName = fileName;
+ alternateFileName.setChar('_', 0);
- // File doesn't exist, try to open the big-endian'd alternate file
- Common::String alternateFileName = fileName;
- alternateFileName.setChar('_', 0);
+ if (_vm->_dataIO->hasFile(alternateFileName)) {
+ bigEndian = true;
+ endianFileName = alternateFileName;
+ }
+ } else if ((_vm->getEndiannessMethod() == kEndiannessMethodBE) ||
+ ((_vm->getEndiannessMethod() == kEndiannessMethodSystem) &&
+ (_vm->getEndianness() == kEndiannessBE)))
+ // Game always little endian or it follows the system and it is big endian
+ bigEndian = true;
- ani = _vm->_dataIO->getFile(alternateFileName);
+ Common::SeekableReadStream *ani = _vm->_dataIO->getFile(endianFileName);
if (ani) {
- Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), true, DisposeAfterUse::YES);
+ Common::SeekableSubReadStreamEndian sub(ani, 0, ani->size(), bigEndian, DisposeAfterUse::YES);
// The big endian version pads a few fields to even size
- _hasPadding = true;
+ _hasPadding = bigEndian;
load(sub, fileName);
return;
}
- warning("ANIFile::ANIFile(): No such file \"%s\"", fileName.c_str());
+ warning("ANIFile::ANIFile(): No such file \"%s\" (\"%s\")", endianFileName.c_str(), fileName.c_str());
}
ANIFile::~ANIFile() {