aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/saveload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cruise/saveload.cpp')
-rw-r--r--engines/cruise/saveload.cpp363
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(&currentActiveBackgroundPlane, 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(&currentActiveMenu, 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);
}