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);  		}  | 
