More savegame-endianness fixes :/

svn-id: r33222
This commit is contained in:
Sven Hesse 2008-07-23 02:41:02 +00:00
parent a5ebc88dbc
commit 5544e180a3
8 changed files with 112 additions and 63 deletions

View File

@ -147,6 +147,15 @@ void GobEngine::validateVideoMode(int16 videoMode) {
error("Video mode 0x%X is not supported!", videoMode);
}
Endianness GobEngine::getEndianness() const {
if ((_vm->getPlatform() == Common::kPlatformAmiga) ||
(_vm->getPlatform() == Common::kPlatformMacintosh) ||
(_vm->getPlatform() == Common::kPlatformAtariST))
return kEndiannessBE;
return kEndiannessLE;
}
Common::Platform GobEngine::getPlatform() const {
return _platform;
}

View File

@ -79,6 +79,11 @@ class SaveLoad;
#define VAR(var) READ_VAR_UINT32(var)
enum Endianness {
kEndiannessLE,
kEndiannessBE
};
enum GameType {
kGameTypeNone = 0,
kGameTypeGob1,
@ -230,6 +235,7 @@ public:
void validateLanguage();
void validateVideoMode(int16 videoMode);
Endianness getEndianness() const;
Common::Platform getPlatform() const;
GameType getGameType() const;
bool isCD() const;

View File

@ -296,9 +296,7 @@ void Inter::callSub(int16 retFlag) {
}
void Inter::allocateVars(uint32 count) {
if ((_vm->getPlatform() == Common::kPlatformAmiga) ||
(_vm->getPlatform() == Common::kPlatformMacintosh) ||
(_vm->getPlatform() == Common::kPlatformAtariST))
if (_vm->getEndianness() == kEndiannessBE)
_variables = new VariablesBE(count * 4);
else
_variables = new VariablesLE(count * 4);

View File

@ -153,7 +153,7 @@ bool TempSprite::fromBuffer(const byte *buffer, int32 size, bool palette) {
}
PlainSave::PlainSave() {
PlainSave::PlainSave(Endianness endianness) : _endianness(endianness) {
}
PlainSave::~PlainSave() {
@ -230,7 +230,8 @@ bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name,
}
bool retVal;
retVal = SaveLoad::saveDataEndian(*out, dataVar, size, variables, variableSizes);
retVal = SaveLoad::saveDataEndian(*out, dataVar, size,
variables, variableSizes, _endianness);
out->finalize();
if (out->ioFailed()) {
@ -258,13 +259,14 @@ bool PlainSave::load(int16 dataVar, int32 size, int32 offset, const char *name,
return false;
}
bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size, variables, variableSizes);
bool retVal = SaveLoad::loadDataEndian(*in, dataVar, size,
variables, variableSizes, _endianness);
delete in;
return retVal;
}
StagedSave::StagedSave() {
StagedSave::StagedSave(Endianness endianness) : _endianness(endianness) {
_mode = kModeNone;
_name = 0;
_loaded = false;
@ -487,7 +489,7 @@ bool StagedSave::write() const {
} else
result = SaveLoad::saveDataEndian(*out, 0, _stages[i].size,
_stages[i].bufVar, _stages[i].bufVarSizes);
_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);
}
if (result) {
@ -533,7 +535,7 @@ bool StagedSave::read() {
_stages[i].bufVarSizes = new byte[_stages[i].size];
result = SaveLoad::loadDataEndian(*in, 0, _stages[i].size,
_stages[i].bufVar, _stages[i].bufVarSizes);
_stages[i].bufVar, _stages[i].bufVarSizes, _endianness);
}
}
@ -734,12 +736,14 @@ void SaveLoad::buildIndex(byte *buffer, char *name, int n, int32 size, int32 off
}
}
bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count) {
bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) {
bool LE = (endianness == kEndiannessLE);
while (count-- > 0) {
if (*sizes == 3)
*((uint32 *) buf) = READ_LE_UINT32(buf);
*((uint32 *) buf) = LE ? READ_LE_UINT32(buf) : READ_BE_UINT32(buf);
else if (*sizes == 1)
*((uint16 *) buf) = READ_LE_UINT16(buf);
*((uint16 *) buf) = LE ? READ_LE_UINT16(buf) : READ_BE_UINT16(buf);
else if (*sizes != 0) {
warning("SaveLoad::fromEndian(): Corrupted variables sizes");
return false;
@ -753,12 +757,19 @@ bool SaveLoad::fromEndian(byte *buf, const byte *sizes, uint32 count) {
return true;
}
bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count) {
bool SaveLoad::toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness) {
while (count-- > 0) {
if (*sizes == 3)
WRITE_LE_UINT32(buf, *((uint32 *) buf));
else if (*sizes == 1)
WRITE_LE_UINT16(buf, *((uint16 *) buf));
if (*sizes == 3) {
if (endianness == kEndiannessLE)
WRITE_LE_UINT32(buf, *((uint32 *) buf));
else
WRITE_BE_UINT32(buf, *((uint32 *) buf));
} else if (*sizes == 1) {
if (endianness == kEndiannessLE)
WRITE_LE_UINT16(buf, *((uint16 *) buf));
else
WRITE_BE_UINT16(buf, *((uint16 *) buf));
}
else if (*sizes != 0) {
warning("SaveLoad::toEndian(): Corrupted variables sizes");
return false;
@ -811,7 +822,8 @@ uint32 SaveLoad::write(Common::WriteStream &out,
}
bool SaveLoad::loadDataEndian(Common::ReadStream &in,
int16 dataVar, uint32 size, byte *variables, byte *variableSizes) {
int16 dataVar, uint32 size,
byte *variables, byte *variableSizes, Endianness endianness) {
bool retVal = false;
@ -821,7 +833,7 @@ bool SaveLoad::loadDataEndian(Common::ReadStream &in,
assert(varBuf && sizeBuf);
if (read(in, varBuf, sizeBuf, size) == size) {
if (fromEndian(varBuf, sizeBuf, size)) {
if (fromEndian(varBuf, sizeBuf, size, endianness)) {
memcpy(variables + dataVar, varBuf, size);
memcpy(variableSizes + dataVar, sizeBuf, size);
retVal = true;
@ -835,7 +847,8 @@ bool SaveLoad::loadDataEndian(Common::ReadStream &in,
}
bool SaveLoad::saveDataEndian(Common::WriteStream &out,
int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes) {
int16 dataVar, uint32 size,
const byte *variables, const byte *variableSizes, Endianness endianness) {
bool retVal = false;
@ -847,7 +860,7 @@ bool SaveLoad::saveDataEndian(Common::WriteStream &out,
memcpy(varBuf, variables + dataVar, size);
memcpy(sizeBuf, variableSizes + dataVar, size);
if (toEndian(varBuf, sizeBuf, size))
if (toEndian(varBuf, sizeBuf, size, endianness))
if (write(out, varBuf, sizeBuf, size) == size)
retVal = true;

View File

@ -65,7 +65,7 @@ private:
class PlainSave {
public:
PlainSave();
PlainSave(Endianness endianness);
~PlainSave();
bool save(int16 dataVar, int32 size, int32 offset, const char *name,
@ -77,11 +77,14 @@ public:
const byte *variables, const byte *variableSizes) const;
bool load(int16 dataVar, int32 size, int32 offset, const char *name,
byte *variables, byte *variableSizes) const;
private:
Endianness _endianness;
};
class StagedSave {
public:
StagedSave();
StagedSave(Endianness endianness);
~StagedSave();
void addStage(int32 size, bool endianed = true);
@ -114,6 +117,8 @@ private:
kModeLoad
};
Endianness _endianness;
Common::Array<Stage> _stages;
enum Mode _mode;
char *_name;
@ -178,17 +183,19 @@ public:
static const char *stripPath(const char *fileName);
static bool fromEndian(byte *buf, const byte *sizes, uint32 count);
static bool toEndian(byte *buf, const byte *sizes, uint32 count);
static bool fromEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness);
static bool toEndian(byte *buf, const byte *sizes, uint32 count, Endianness endianness);
static uint32 read(Common::ReadStream &in,
byte *buf, byte *sizes, uint32 count);
static uint32 write(Common::WriteStream &out,
const byte *buf, const byte *sizes, uint32 count);
static bool loadDataEndian(Common::ReadStream &in,
int16 dataVar, uint32 size, byte *variables, byte *variableSizes);
int16 dataVar, uint32 size,
byte *variables, byte *variableSizes, Endianness endianness);
static bool saveDataEndian(Common::WriteStream &out,
int16 dataVar, uint32 size, const byte *variables, const byte *variableSizes);
int16 dataVar, uint32 size,
const byte *variables, const byte *variableSizes, Endianness endianness);
protected:
GobEngine *_vm;
@ -228,8 +235,8 @@ protected:
int32 _varSize;
TempSprite _tmpSprite;
PlainSave _notes;
StagedSave _save;
PlainSave *_notes;
StagedSave *_save;
byte _indexBuffer[600];
bool _hasIndex;
@ -306,8 +313,8 @@ protected:
TempSprite _screenshot;
TempSprite _tmpSprite;
PlainSave _notes;
StagedSave _save;
PlainSave *_notes;
StagedSave *_save;
byte _propBuffer[1000];
byte _indexBuffer[1200];
@ -370,7 +377,7 @@ protected:
int32 _varSize;
StagedSave _save;
StagedSave *_save;
byte _propBuffer[1000];
byte _indexBuffer[1200];

View File

@ -45,6 +45,9 @@ SaveLoad_v2::SaveFile SaveLoad_v2::_saveFiles[] = {
SaveLoad_v2::SaveLoad_v2(GobEngine *vm, const char *targetName) :
SaveLoad(vm, targetName) {
_notes = new PlainSave(_vm->getEndianness());
_save = new StagedSave(_vm->getEndianness());
_saveFiles[0].destName = new char[strlen(targetName) + 5];
_saveFiles[1].destName = _saveFiles[0].destName;
_saveFiles[2].destName = 0;
@ -58,6 +61,9 @@ SaveLoad_v2::SaveLoad_v2(GobEngine *vm, const char *targetName) :
}
SaveLoad_v2::~SaveLoad_v2() {
delete _notes;
delete _save;
delete[] _saveFiles[0].destName;
delete[] _saveFiles[3].destName;
}
@ -227,7 +233,7 @@ bool SaveLoad_v2::loadGame(SaveFile &saveFile,
return false;
}
if (!_save.load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
if (!_save->load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -268,7 +274,7 @@ bool SaveLoad_v2::loadNotes(SaveFile &saveFile,
debugC(2, kDebugSaveLoad, "Loading the notes");
return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
}
bool SaveLoad_v2::saveGame(SaveFile &saveFile,
@ -313,10 +319,10 @@ bool SaveLoad_v2::saveGame(SaveFile &saveFile,
byte sizes[40];
memset(sizes, 0, 40);
if(!_save.save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes))
if(!_save->save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes))
return false;
if (!_save.save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
if (!_save->save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -350,7 +356,7 @@ bool SaveLoad_v2::saveNotes(SaveFile &saveFile,
debugC(2, kDebugSaveLoad, "Saving the notes");
return _notes.save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
return _notes->save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
return false;
}
@ -360,8 +366,8 @@ void SaveLoad_v2::assertInited() {
_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
_save.addStage(40);
_save.addStage(_varSize);
_save->addStage(40);
_save->addStage(_varSize);
}
} // End of namespace Gob

View File

@ -48,6 +48,9 @@ SaveLoad_v3::SaveLoad_v3(GobEngine *vm, const char *targetName,
uint32 screenshotSize, int32 indexOffset, int32 screenshotOffset) :
SaveLoad(vm, targetName) {
_notes = new PlainSave(_vm->getEndianness());
_save = new StagedSave(_vm->getEndianness());
_screenshotSize = screenshotSize;
_indexOffset = indexOffset;
_screenshotOffset = screenshotOffset;
@ -71,6 +74,9 @@ SaveLoad_v3::SaveLoad_v3(GobEngine *vm, const char *targetName,
}
SaveLoad_v3::~SaveLoad_v3() {
delete _notes;
delete _save;
delete[] _saveFiles[0].destName;
delete[] _saveFiles[3].destName;
}
@ -243,7 +249,7 @@ int32 SaveLoad_v3::getSizeNotes(SaveFile &saveFile) {
int32 SaveLoad_v3::getSizeScreenshot(SaveFile &saveFile) {
if (!_useScreenshots) {
_useScreenshots = true;
_save.addStage(_screenshotSize, false);
_save->addStage(_screenshotSize, false);
}
Common::SaveFileManager *saveMan = g_system->getSavefileManager();
@ -312,7 +318,7 @@ bool SaveLoad_v3::loadGame(SaveFile &saveFile,
return false;
}
if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -353,7 +359,7 @@ bool SaveLoad_v3::loadNotes(SaveFile &saveFile,
debugC(2, kDebugSaveLoad, "Loading the notes");
return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
return _notes->load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables);
}
bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,
@ -363,7 +369,7 @@ bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,
if (!_useScreenshots) {
_useScreenshots = true;
_save.addStage(_screenshotSize, false);
_save->addStage(_screenshotSize, false);
}
if (offset == _indexOffset) {
@ -395,7 +401,7 @@ bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile,
byte *buffer = new byte[_screenshotSize];
if (!_save.load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
if (!_save->load(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
delete[] buffer;
return false;
}
@ -483,13 +489,13 @@ bool SaveLoad_v3::saveGame(SaveFile &saveFile,
_hasIndex = false;
if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
return false;
if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0))
if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0))
return false;
if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -523,7 +529,7 @@ bool SaveLoad_v3::saveNotes(SaveFile &saveFile,
debugC(2, kDebugSaveLoad, "Saving the notes");
return _notes.save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables);
return _notes->save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables);
return false;
}
@ -534,7 +540,7 @@ bool SaveLoad_v3::saveScreenshot(SaveFile &saveFile,
if (!_useScreenshots) {
_useScreenshots = true;
_save.addStage(_screenshotSize, false);
_save->addStage(_screenshotSize, false);
}
if (offset >= _screenshotOffset) {
@ -571,7 +577,7 @@ bool SaveLoad_v3::saveScreenshot(SaveFile &saveFile,
return false;
}
if (!_save.save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
if (!_save->save(0, _screenshotSize, _varSize + 540, saveFile.destName, buffer, 0)) {
delete[] buffer;
return false;
}
@ -588,9 +594,9 @@ void SaveLoad_v3::assertInited() {
_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
_save.addStage(500);
_save.addStage(40, false);
_save.addStage(_varSize);
_save->addStage(500);
_save->addStage(40, false);
_save->addStage(_varSize);
}
void SaveLoad_v3::buildScreenshotIndex(byte *buffer, char *name, int n) {

View File

@ -50,6 +50,8 @@ SaveLoad_v4::SaveFile SaveLoad_v4::_saveFiles[] = {
SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :
SaveLoad(vm, targetName) {
_save = new StagedSave(_vm->getEndianness());
_firstSizeGame = true;
_saveFiles[0].destName = 0;
@ -76,6 +78,8 @@ SaveLoad_v4::SaveLoad_v4(GobEngine *vm, const char *targetName) :
}
SaveLoad_v4::~SaveLoad_v4() {
delete _save;
delete[] _screenProps;
delete[] _saveFiles[1].destName;
}
@ -297,7 +301,7 @@ bool SaveLoad_v4::loadGame(SaveFile &saveFile,
return false;
}
if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
if (!_save->load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -314,7 +318,7 @@ bool SaveLoad_v4::loadGameScreenProps(SaveFile &saveFile,
setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
if (!_save.load(0, 256000, _varSize + 540, saveFile.destName,
if (!_save->load(0, 256000, _varSize + 540, saveFile.destName,
_screenProps, _screenProps + 256000))
return false;
@ -393,13 +397,13 @@ bool SaveLoad_v4::saveGame(SaveFile &saveFile,
_hasIndex = false;
if(!_save.save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
if(!_save->save(0, 500, 0, saveFile.destName, _propBuffer, _propBuffer + 500))
return false;
if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0))
if(!_save->save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0))
return false;
if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
if (!_save->save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables))
return false;
}
@ -417,7 +421,7 @@ bool SaveLoad_v4::saveGameScreenProps(SaveFile &saveFile,
setCurrentSlot(saveFile.destName, saveFile.sourceName[4] - '0');
if (!_save.save(0, 256000, _varSize + 540, saveFile.destName,
if (!_save->save(0, 256000, _varSize + 540, saveFile.destName,
_screenProps, _screenProps + 256000))
return false;
@ -430,10 +434,10 @@ void SaveLoad_v4::assertInited() {
_varSize = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4;
_save.addStage(500);
_save.addStage(40, false);
_save.addStage(_varSize);
_save.addStage(256000);
_save->addStage(500);
_save->addStage(40, false);
_save->addStage(_varSize);
_save->addStage(256000);
}
} // End of namespace Gob