diff options
Diffstat (limited to 'engines/cruise/saveload.cpp')
-rw-r--r-- | engines/cruise/saveload.cpp | 363 |
1 files changed, 210 insertions, 153 deletions
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp index 581ed3a9fc..f937eab8a3 100644 --- a/engines/cruise/saveload.cpp +++ b/engines/cruise/saveload.cpp @@ -27,7 +27,7 @@ namespace Cruise { -void loadSavegameDataSub1(FILE *fileHandle) { +void loadSavegameDataSub1(Common::File& currentSaveFile) { int i; for (i = 1; i < numOfLoadedOverlay; i++) { @@ -36,58 +36,58 @@ void loadSavegameDataSub1(FILE *fileHandle) { filesData2[i].field_0 = 0; if (overlayTable[i].alreadyLoaded) { - fread(&filesData2[i].field_0, 2, 1, fileHandle); + filesData2[i].field_0 = currentSaveFile.readSint16LE(); if (filesData2[i].field_0) { - filesData[i].field_0 = - (uint8 *) mallocAndZero(filesData2[i]. - field_0); + filesData[i].field_0 = (uint8 *) mallocAndZero(filesData2[i].field_0); if (filesData[i].field_0) { - fread(filesData[i].field_0, - filesData2[i].field_0, 1, - fileHandle); + currentSaveFile.read(filesData[i].field_0, filesData2[i].field_0); } } - fread(&filesData2[i].field_2, 2, 1, fileHandle); + filesData2[i].field_2 = currentSaveFile.readSint16LE(); if (filesData2[i].field_2) { - filesData[i].field_4 = - (uint8 *) mallocAndZero(filesData2[i]. - field_2 * 12); + filesData[i].field_4 = (uint8 *) mallocAndZero(filesData2[i].field_2 * 12); if (filesData[i].field_4) { - fread(filesData[i].field_4, - filesData2[i].field_2 * 12, 1, - fileHandle); + currentSaveFile.read(filesData[i].field_4, filesData2[i].field_2 * 12); } } } } } -void loadScriptsFromSave(FILE *fileHandle, scriptInstanceStruct *entry) { +void loadScriptsFromSave(Common::File& currentSaveFile, scriptInstanceStruct *entry) { short int numScripts; int i; - fread(&numScripts, 2, 1, fileHandle); + numScripts = currentSaveFile.readSint16LE(); for (i = 0; i < numScripts; i++) { - scriptInstanceStruct *ptr = - (scriptInstanceStruct *) - mallocAndZero(sizeof(scriptInstanceStruct)); + scriptInstanceStruct *ptr = (scriptInstanceStruct *)mallocAndZero(sizeof(scriptInstanceStruct)); - fread(ptr, 0x1C, 1, fileHandle); // use 0x1C as our scriptInstanceStruct is bigger than in original because of cross platform problems + currentSaveFile.skip(2); - fread(&ptr->varA, 2, 1, fileHandle); + ptr->ccr = currentSaveFile.readSint16LE(); + ptr->var4 = currentSaveFile.readSint16LE(); + currentSaveFile.skip(4); + ptr->varA = currentSaveFile.readSint16LE(); + ptr->scriptNumber = currentSaveFile.readSint16LE(); + ptr->overlayNumber = currentSaveFile.readSint16LE(); + ptr->sysKey = currentSaveFile.readSint16LE(); + ptr->freeze = currentSaveFile.readSint16LE(); + ptr->type = (scriptTypeEnum)currentSaveFile.readSint16LE(); + ptr->var16 = currentSaveFile.readSint16LE(); + ptr->var18 = currentSaveFile.readSint16LE(); + ptr->var1A = currentSaveFile.readSint16LE(); + + ptr->varA = currentSaveFile.readUint16LE(); if (ptr->varA) { ptr->var6 = (uint8 *) mallocAndZero(ptr->varA); - fread(ptr->var6, ptr->varA, 1, fileHandle); + currentSaveFile.read(ptr->var6, ptr->varA); } - ///////// - ptr->bitMask = *((int16 *) ptr + 1); - ///////// ptr->nextScriptPtr = 0; @@ -96,20 +96,39 @@ void loadScriptsFromSave(FILE *fileHandle, scriptInstanceStruct *entry) { } } -void loadSavegameActor(FILE *fileHandle) { +void loadSavegameActor(Common::File& currentSaveFile) { short int numEntry; actorStruct *ptr; int i; - fread(&numEntry, 2, 1, fileHandle); + numEntry = currentSaveFile.readSint16LE(); ptr = &actorHead; for (i = 0; i < numEntry; i++) { - actorStruct *current = - (actorStruct *) mallocAndZero(sizeof(actorStruct)); - fseek(fileHandle, 4, SEEK_CUR); - fread(current, 0x26, 1, fileHandle); + actorStruct *current = (actorStruct *) mallocAndZero(sizeof(actorStruct)); + currentSaveFile.skip(2); + currentSaveFile.skip(2); + + current->idx = currentSaveFile.readSint16LE(); + current->type = currentSaveFile.readSint16LE(); + current->overlayNumber = currentSaveFile.readSint16LE(); + current->x_dest = currentSaveFile.readSint16LE(); + current->y_dest = currentSaveFile.readSint16LE(); + current->x = currentSaveFile.readSint16LE(); + current->y = currentSaveFile.readSint16LE(); + current->startDirection = currentSaveFile.readSint16LE(); + current->nextDirection = currentSaveFile.readSint16LE(); + current->endDirection = currentSaveFile.readSint16LE(); + current->stepX = currentSaveFile.readSint16LE(); + current->stepY = currentSaveFile.readSint16LE(); + current->pathId = currentSaveFile.readSint16LE(); + current->phase = (animPhase)currentSaveFile.readSint16LE(); + current->counter = currentSaveFile.readSint16LE(); + current->poly = currentSaveFile.readSint16LE(); + current->flag = currentSaveFile.readSint16LE(); + current->start = currentSaveFile.readSint16LE(); + current->freeze = currentSaveFile.readSint16LE(); current->next = NULL; ptr->next = current; @@ -119,46 +138,42 @@ void loadSavegameActor(FILE *fileHandle) { } } -void loadSavegameDataSub5(FILE *fileHandle) { +void loadSavegameDataSub5(Common::File& currentSaveFile) { if (var1) { - fread(&saveVar1, 1, 1, fileHandle); + saveVar1 = currentSaveFile.readByte(); if (saveVar1) { - fread(saveVar2, saveVar1, 1, fileHandle); + currentSaveFile.read(saveVar2, saveVar1); } } else { - fread(&saveVar1, 1, 1, fileHandle); + saveVar1 = currentSaveFile.readByte(); } } -void loadSavegameDataSub6(FILE *fileHandle) { +void loadSavegameDataSub6(Common::File& currentSaveFile) { int32 var; - fread(&var, 4, 1, fileHandle); + var = currentSaveFile.readUint32LE(); flipLong(&var); if (var) { int i; - fread(&numberOfWalkboxes, 2, 1, fileHandle); + numberOfWalkboxes = currentSaveFile.readUint16LE(); if (numberOfWalkboxes) { - fread(walkboxType, numberOfWalkboxes * 2, 1, - fileHandle); - fread(walkboxType, numberOfWalkboxes * 2, 1, - fileHandle); + currentSaveFile.read(walkboxType, numberOfWalkboxes * 2); + currentSaveFile.read(walkboxChange, numberOfWalkboxes * 2); } for (i = 0; i < 10; i++) { - fread(&persoTable[i], 4, 1, fileHandle); + persoTable[i] = (persoStruct*)currentSaveFile.readSint32LE(); if (persoTable[i]) { assert(sizeof(persoStruct) == 0x6AA); - persoTable[i] = - (persoStruct *) - mallocAndZero(sizeof(persoStruct)); - fread(persoTable[i], 0x6AA, 1, fileHandle); + persoTable[i] = (persoStruct *)mallocAndZero(sizeof(persoStruct)); + currentSaveFile.read(persoTable[i], 0x6AA); } } } @@ -166,17 +181,16 @@ void loadSavegameDataSub6(FILE *fileHandle) { int loadSavegameData(int saveGameIdx) { char buffer[256]; - FILE *fileHandle; char saveIdentBuffer[6]; - int j; int initVar1Save; cellStruct *currentcellHead; sprintf(buffer, "CR.%d", saveGameIdx); - fileHandle = fopen(buffer, "rb"); + Common::File currentSaveFile; + currentSaveFile.open(buffer); - if (!fileHandle) { + if (!currentSaveFile.isOpen()) { printInfoBlackBox("Savegame not found..."); waitForPlayerInput(); return (-1); @@ -184,126 +198,175 @@ int loadSavegameData(int saveGameIdx) { printInfoBlackBox("Loading in progress..."); - fread(saveIdentBuffer, 6, 1, fileHandle); + currentSaveFile.read(saveIdentBuffer, 6); if (strcmp(saveIdentBuffer, "SAVPC")) { - fclose(fileHandle); + currentSaveFile.close(); return (-1); } //initVars(); - fread(&var1, 2, 1, fileHandle); - fread(&var2, 2, 1, fileHandle); - fread(&var3, 2, 1, fileHandle); - fread(&var4, 2, 1, fileHandle); - fread(&userEnabled, 2, 1, fileHandle); - fread(&dialogueEnabled, 2, 1, fileHandle); - fread(&var7, 2, 1, fileHandle); - fread(&var8, 2, 1, fileHandle); - fread(&userDelay, 2, 1, fileHandle); - fread(&sysKey, 2, 1, fileHandle); - fread(&sysX, 2, 1, fileHandle); - fread(&sysY, 2, 1, fileHandle); - fread(&var13, 2, 1, fileHandle); - fread(&var14, 2, 1, fileHandle); - fread(&affichePasMenuJoueur, 2, 1, fileHandle); - fread(&var20, 2, 1, fileHandle); - fread(&var22, 2, 1, fileHandle); - fread(&var23, 2, 1, fileHandle); - fread(&var24, 2, 1, fileHandle); - fread(&automaticMode, 2, 1, fileHandle); + var1 = currentSaveFile.readSint16LE(); + var2 = currentSaveFile.readSint16LE(); + var3 = currentSaveFile.readSint16LE(); + var4 = currentSaveFile.readSint16LE(); + userEnabled = currentSaveFile.readSint16LE(); + dialogueEnabled = currentSaveFile.readSint16LE(); + + var7 = currentSaveFile.readSint16LE(); + var8 = currentSaveFile.readSint16LE(); + userDelay = currentSaveFile.readSint16LE(); + sysKey = currentSaveFile.readSint16LE(); + sysX = currentSaveFile.readSint16LE(); + sysY = currentSaveFile.readSint16LE(); + var13 = currentSaveFile.readSint16LE(); + var14 = currentSaveFile.readSint16LE(); + affichePasMenuJoueur = currentSaveFile.readSint16LE(); + var20 = currentSaveFile.readSint16LE(); + var22 = currentSaveFile.readSint16LE(); + var23 = currentSaveFile.readSint16LE(); + var24 = currentSaveFile.readSint16LE(); + automaticMode = currentSaveFile.readSint16LE(); // video param (not loaded in EGA mode) - fread(&video4, 2, 1, fileHandle); - fread(&video2, 2, 1, fileHandle); - fread(&video3, 2, 1, fileHandle); - fread(&colorOfSelectedSaveDrive, 2, 1, fileHandle); + video4 = currentSaveFile.readSint16LE(); + video2 = currentSaveFile.readSint16LE(); + video3 = currentSaveFile.readSint16LE(); + colorOfSelectedSaveDrive = currentSaveFile.readSint16LE(); // - fread(&narratorOvl, 2, 1, fileHandle); - fread(&narratorIdx, 2, 1, fileHandle); - fread(&aniX, 2, 1, fileHandle); - fread(&aniY, 2, 1, fileHandle); - int16 bTemp; - fread(&bTemp, 2, 1, fileHandle); - animationStart = bTemp != 0; - fread(¤tActiveBackgroundPlane, 2, 1, fileHandle); - fread(&initVar3, 2, 1, fileHandle); - fread(&initVar2, 2, 1, fileHandle); - fread(&var22, 2, 1, fileHandle); - fread(&main5, 2, 1, fileHandle); - fread(&numOfLoadedOverlay, 2, 1, fileHandle); - fread(&setup1, 2, 1, fileHandle); - fread(&fontFileIndex, 2, 1, fileHandle); - fread(¤tActiveMenu, 2, 1, fileHandle); - fread(&userWait, 2, 1, fileHandle); // ok - fread(&autoOvl, 2, 1, fileHandle); - fread(&autoMsg, 2, 1, fileHandle); - fread(&autoTrack, 2, 1, fileHandle); - fread(&var39, 2, 1, fileHandle); - fread(&var42, 2, 1, fileHandle); - fread(&var45, 2, 1, fileHandle); - fread(&var46, 2, 1, fileHandle); - fread(&var47, 2, 1, fileHandle); - fread(&var48, 2, 1, fileHandle); - fread(&flagCt, 2, 1, fileHandle); - fread(&var41, 2, 1, fileHandle); - fread(&entrerMenuJoueur, 2, 1, fileHandle); - - fread(var50, 64, 1, fileHandle); - fread(var50, 64, 1, fileHandle); // Hu ? why 2 times ? - fread(&systemStrings, sizeof(systemStrings), 1, fileHandle); // ok - fread(currentCtpName, 40, 1, fileHandle); - fread(backgroundTable, 120, 1, fileHandle); - fread(palette, 256, 2, fileHandle); // ok - fread(initVar5, 24, 1, fileHandle); - fread(globalVars, setup1 * 2, 1, fileHandle); - fread(filesDatabase, 9766, 1, fileHandle); - fread(overlayTable, 40 * numOfLoadedOverlay, 1, fileHandle); // ok - fread(mediumVar, 0x880, 1, fileHandle); - - loadSavegameDataSub1(fileHandle); - loadScriptsFromSave(fileHandle, &procHead); - loadScriptsFromSave(fileHandle, &relHead); - - loadSavegameDataSub2(fileHandle); - loadBackgroundIncrustFromSave(fileHandle); - loadSavegameActor(fileHandle); - loadSavegameDataSub5(fileHandle); - loadSavegameDataSub6(fileHandle); - - fclose(fileHandle); // finished with loading !!!!! Yatta ! - - for (j = 0; j < 64; j++) { + narratorOvl = currentSaveFile.readSint16LE(); + narratorIdx = currentSaveFile.readSint16LE(); + aniX = currentSaveFile.readSint16LE(); + aniY = currentSaveFile.readSint16LE(); + + if(currentSaveFile.readSint16LE()) // cast to bool + animationStart = true; + else + animationStart = false; + + currentActiveBackgroundPlane = currentSaveFile.readSint16LE(); + initVar3 = currentSaveFile.readSint16LE(); + initVar2 = currentSaveFile.readSint16LE(); + var22 = currentSaveFile.readSint16LE(); + main5 = currentSaveFile.readSint16LE(); + numOfLoadedOverlay = currentSaveFile.readSint16LE(); + setup1 = currentSaveFile.readSint16LE(); + fontFileIndex = currentSaveFile.readSint16LE(); + currentActiveMenu = currentSaveFile.readSint16LE(); + userWait = currentSaveFile.readSint16LE(); + autoOvl = currentSaveFile.readSint16LE(); + autoMsg = currentSaveFile.readSint16LE(); + autoTrack = currentSaveFile.readSint16LE(); + var39 = currentSaveFile.readSint16LE(); + var42 = currentSaveFile.readSint16LE(); + var45 = currentSaveFile.readSint16LE(); + var46 = currentSaveFile.readSint16LE(); + var47 = currentSaveFile.readSint16LE(); + var48 = currentSaveFile.readSint16LE(); + flagCt = currentSaveFile.readSint16LE(); + var41 = currentSaveFile.readSint16LE(); + entrerMenuJoueur = currentSaveFile.readSint16LE(); + + currentSaveFile.read(var50, 64); + currentSaveFile.read(var50, 64); // Hu ? why 2 times ? + + // here code seems bogus... this should read music name and it may be a buffer overrun + currentSaveFile.skip(21); + + currentSaveFile.read(currentCtpName, 40); + + // restore backgroundTable + for(int i=0; i<8; i++) + { + currentSaveFile.read(backgroundTable[i].name, 9); + currentSaveFile.read(backgroundTable[i].extention, 6); + } + + currentSaveFile.read(palette, 256*2); + currentSaveFile.read(initVar5, 24); + currentSaveFile.read(globalVars, setup1 * 2); // ok + for(int i=0; i<257; i++) + { + filesDatabase[i].widthInColumn = currentSaveFile.readUint16LE(); + filesDatabase[i].width = currentSaveFile.readUint16LE(); + filesDatabase[i].resType = currentSaveFile.readUint16LE(); + filesDatabase[i].height = currentSaveFile.readUint16LE(); + filesDatabase[i].subData.ptr = (uint8*)currentSaveFile.readSint32LE(); + filesDatabase[i].subData.index = currentSaveFile.readSint16LE(); + currentSaveFile.read(filesDatabase[i].subData.name, 13); + currentSaveFile.skip(1); + filesDatabase[i].subData.transparency = currentSaveFile.readSint16LE(); + filesDatabase[i].subData.ptrMask = (uint8*)currentSaveFile.readSint32LE(); + filesDatabase[i].subData.resourceType = currentSaveFile.readByte(); + currentSaveFile.skip(1); + filesDatabase[i].subData.compression = currentSaveFile.readSint16LE(); + } + + for(int i=0; i<numOfLoadedOverlay; i++) + { + currentSaveFile.read(overlayTable[i].overlayName, 13); + currentSaveFile.skip(1); + currentSaveFile.skip(4); + overlayTable[i].alreadyLoaded = currentSaveFile.readSint16LE(); + overlayTable[i].state = currentSaveFile.readSint16LE(); + currentSaveFile.skip(4); + currentSaveFile.skip(4); + currentSaveFile.skip(4); + currentSaveFile.skip(4); + overlayTable[i].executeScripts = currentSaveFile.readSint16LE(); + } + + for(int i=0; i<64; i++) + { + currentSaveFile.read(mediumVar[i].name, 15); + currentSaveFile.skip(1); + mediumVar[i].size = currentSaveFile.readSint32LE(); + mediumVar[i].sourceSize = currentSaveFile.readSint32LE(); + currentSaveFile.skip(4); + mediumVar[i].nofree = currentSaveFile.readSint16LE(); + mediumVar[i].protect = currentSaveFile.readSint16LE(); + mediumVar[i].ovl = currentSaveFile.readSint16LE(); + } + + loadSavegameDataSub1(currentSaveFile); + loadScriptsFromSave(currentSaveFile, &procHead); + loadScriptsFromSave(currentSaveFile, &relHead); + + loadSavegameDataSub2(currentSaveFile); + loadBackgroundIncrustFromSave(currentSaveFile); + loadSavegameActor(currentSaveFile); + loadSavegameDataSub5(currentSaveFile); + loadSavegameDataSub6(currentSaveFile); + + currentSaveFile.close(); + + for (int j = 0; j < 64; j++) { mediumVar[j].ptr = NULL; } - for (j = 1; j < numOfLoadedOverlay; j++) { + for (int j = 1; j < numOfLoadedOverlay; j++) { if (overlayTable[j].alreadyLoaded) { overlayTable[j].alreadyLoaded = 0; loadOverlay((uint8 *) overlayTable[j].overlayName); if (overlayTable[j].alreadyLoaded) { - ovlDataStruct *ovlData = - overlayTable[j].ovlData; + ovlDataStruct *ovlData = overlayTable[j].ovlData; if (filesData[j].field_0) { if (ovlData->data4Ptr) { free(ovlData->data4Ptr); } - ovlData->data4Ptr = - (uint8 *) filesData[j].field_0; - ovlData->sizeOfData4 = - filesData2[j].field_0; + ovlData->data4Ptr = (uint8 *) filesData[j].field_0; + ovlData->sizeOfData4 = filesData2[j].field_0; } if (filesData[j].field_4) { if (ovlData->arrayObjVar) { - free(ovlData-> - arrayObjVar); + free(ovlData->arrayObjVar); } ovlData->arrayObjVar = (objectParams *) filesData[j].field_4; // TODO: fix ! @@ -320,17 +383,14 @@ int loadSavegameData(int saveGameIdx) { initVar1Save = initVar1; - for (j = 0; j < 257; j++) { + for (int j = 0; j < 257; j++) { if (filesDatabase[j].subData.ptr) { int i; int k; for (i = j + 1; i < 257; i++) { if (filesDatabase[i].subData.ptr) { - if (strcmpuint8(filesDatabase[j]. - subData.name, - filesDatabase[i].subData. - name)) { + if (strcmpuint8(filesDatabase[j].subData.name, filesDatabase[i].subData.name)) { break; } } else { @@ -351,9 +411,7 @@ int loadSavegameData(int saveGameIdx) { exit(1); //loadFileMode1(filesDatabase[j].subData.name,filesDatabase[j].subData.var4); } else { - loadFileMode2((uint8 *) filesDatabase[j]. - subData.name, - filesDatabase[j].subData.index, j, i - j); + loadFileMode2((uint8 *) filesDatabase[j].subData.name, filesDatabase[j].subData.index, j, i - j); j = i - 1; } @@ -367,8 +425,7 @@ int loadSavegameData(int saveGameIdx) { while (currentcellHead) { if (currentcellHead->type == 5) { - uint8 *ptr = - mainProc14(currentcellHead->overlay, + uint8 *ptr = mainProc14(currentcellHead->overlay, currentcellHead->idx); ASSERT(0); @@ -394,7 +451,7 @@ int loadSavegameData(int saveGameIdx) { //prepareFadeOut(); //gfxModuleData.gfxFunction8(); - for (j = 0; j < 8; j++) { + for (int j = 0; j < 8; j++) { if (strlen((char *)backgroundTable[j].name)) { loadBackground(backgroundTable[j].name, j); } |