aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/saveload.cpp
diff options
context:
space:
mode:
authorVincent Hamm2007-11-10 19:47:07 +0000
committerVincent Hamm2007-11-10 19:47:07 +0000
commit34a696662a434fe8afdbee21d7986a88b49208ec (patch)
treeb09401c40c72f06aed1a4bb3f6653d7e606bce74 /engines/cruise/saveload.cpp
parentd624add74243152fa6639ba43cd04f6cfd816447 (diff)
downloadscummvm-rg350-34a696662a434fe8afdbee21d7986a88b49208ec.tar.gz
scummvm-rg350-34a696662a434fe8afdbee21d7986a88b49208ec.tar.bz2
scummvm-rg350-34a696662a434fe8afdbee21d7986a88b49208ec.zip
Fix boggus object state
svn-id: r29469
Diffstat (limited to 'engines/cruise/saveload.cpp')
-rw-r--r--engines/cruise/saveload.cpp61
1 files changed, 41 insertions, 20 deletions
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
index 9d94045da6..9f33b1a3ac 100644
--- a/engines/cruise/saveload.cpp
+++ b/engines/cruise/saveload.cpp
@@ -27,30 +27,47 @@
namespace Cruise {
+struct overlayRestoreTemporary {
+ int _sBssSize;
+ uint8* _pBss;
+ int _sNumObj;
+ objectParams* _pObj;
+};
+
+overlayRestoreTemporary ovlRestoreData[90];
+
void loadSavegameDataSub1(Common::File& currentSaveFile) {
int i;
for (i = 1; i < numOfLoadedOverlay; i++) {
- filesData[i].field_4 = NULL;
- filesData[i].field_0 = NULL;
- filesData2[i].field_0 = 0;
+ ovlRestoreData[i]._sBssSize = ovlRestoreData[i]._sNumObj = 0;
+ ovlRestoreData[i]._pBss = NULL;
+ ovlRestoreData[i]._pObj = NULL;
if (overlayTable[i].alreadyLoaded) {
- filesData2[i].field_0 = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._sBssSize = currentSaveFile.readSint16LE();
- if (filesData2[i].field_0) {
- filesData[i].field_0 = (uint8 *) mallocAndZero(filesData2[i].field_0);
- if (filesData[i].field_0) {
- currentSaveFile.read(filesData[i].field_0, filesData2[i].field_0);
- }
+ if (ovlRestoreData[i]._sBssSize) {
+ ovlRestoreData[i]._pBss = (uint8 *) mallocAndZero(ovlRestoreData[i]._sBssSize);
+ ASSERT(ovlRestoreData[i]._pBss);
+
+ currentSaveFile.read(ovlRestoreData[i]._pBss, ovlRestoreData[i]._sBssSize);
}
- filesData2[i].field_2 = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._sNumObj = currentSaveFile.readSint16LE();
- if (filesData2[i].field_2) {
- filesData[i].field_4 = (uint8 *) mallocAndZero(filesData2[i].field_2 * 12);
- if (filesData[i].field_4) {
- currentSaveFile.read(filesData[i].field_4, filesData2[i].field_2 * 12);
+ if (ovlRestoreData[i]._sNumObj) {
+ ovlRestoreData[i]._pObj = (objectParams *) mallocAndZero(ovlRestoreData[i]._sNumObj * sizeof(objectParams));
+ ASSERT(ovlRestoreData[i]._pObj);
+
+ for(int j=0; j<ovlRestoreData[i]._sNumObj; j++)
+ {
+ ovlRestoreData[i]._pObj[j].X = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._pObj[j].Y = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._pObj[j].Z = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._pObj[j].frame = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._pObj[j].scale = currentSaveFile.readSint16LE();
+ ovlRestoreData[i]._pObj[j].state = currentSaveFile.readSint16LE();
}
}
}
@@ -355,22 +372,26 @@ int loadSavegameData(int saveGameIdx) {
if (overlayTable[j].alreadyLoaded) {
ovlDataStruct *ovlData = overlayTable[j].ovlData;
- if (filesData[j].field_0) {
+ // overlay BSS
+
+ if (ovlRestoreData[j]._sBssSize) {
if (ovlData->data4Ptr) {
free(ovlData->data4Ptr);
}
- ovlData->data4Ptr = (uint8 *) filesData[j].field_0;
- ovlData->sizeOfData4 = filesData2[j].field_0;
+ ovlData->data4Ptr = ovlRestoreData[j]._pBss;
+ ovlData->sizeOfData4 = ovlRestoreData[j]._sBssSize;
}
- if (filesData[j].field_4) {
+ // overlay object data
+
+ if (ovlRestoreData[j]._sNumObj) {
if (ovlData->arrayObjVar) {
free(ovlData->arrayObjVar);
}
- ovlData->arrayObjVar = (objectParams *) filesData[j].field_4; // TODO: fix !
- ovlData->size9 = filesData2[j].field_2;
+ ovlData->arrayObjVar = ovlRestoreData[j]._pObj;
+ ovlData->size9 = ovlRestoreData[j]._sNumObj;
}
}