diff options
| author | Vincent Hamm | 2007-11-08 22:59:29 +0000 | 
|---|---|---|
| committer | Vincent Hamm | 2007-11-08 22:59:29 +0000 | 
| commit | 783a0bf67d7319f291202a739bfaf82b77295448 (patch) | |
| tree | 9b2fef6af76108377a02886ecd24f067bc36845b | |
| parent | c2594cb3f2675021537008b9501291004316802f (diff) | |
| download | scummvm-rg350-783a0bf67d7319f291202a739bfaf82b77295448.tar.gz scummvm-rg350-783a0bf67d7319f291202a739bfaf82b77295448.tar.bz2 scummvm-rg350-783a0bf67d7319f291202a739bfaf82b77295448.zip | |
Cleanup load savegame from original interpreter
svn-id: r29453
| -rw-r--r-- | engines/cruise/backgroundIncrust.cpp | 53 | ||||
| -rw-r--r-- | engines/cruise/backgroundIncrust.h | 4 | ||||
| -rw-r--r-- | engines/cruise/cell.cpp | 38 | ||||
| -rw-r--r-- | engines/cruise/cell.h | 2 | ||||
| -rw-r--r-- | engines/cruise/cruise_main.cpp | 53 | ||||
| -rw-r--r-- | engines/cruise/dataLoader.cpp | 4 | ||||
| -rw-r--r-- | engines/cruise/font.cpp | 4 | ||||
| -rw-r--r-- | engines/cruise/overlay.h | 46 | ||||
| -rw-r--r-- | engines/cruise/saveload.cpp | 363 | ||||
| -rw-r--r-- | engines/cruise/script.cpp | 4 | ||||
| -rw-r--r-- | engines/cruise/script.h | 3 | ||||
| -rw-r--r-- | engines/cruise/vars.h | 27 | 
12 files changed, 338 insertions, 263 deletions
| diff --git a/engines/cruise/backgroundIncrust.cpp b/engines/cruise/backgroundIncrust.cpp index 942b4d0e0d..64e8cdb3ec 100644 --- a/engines/cruise/backgroundIncrust.cpp +++ b/engines/cruise/backgroundIncrust.cpp @@ -135,45 +135,46 @@ backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx,	int16 objectIdx,  	return newElement;  } -void loadBackgroundIncrustFromSave(FILE *fileHandle) { +void loadBackgroundIncrustFromSave(Common::File& currentSaveFile) {  	int16 numEntry;  	backgroundIncrustStruct *ptr1;  	backgroundIncrustStruct *ptr2;  	int32 i; -	fread(&numEntry, 2, 1, fileHandle); +	numEntry = currentSaveFile.readSint16LE();  	ptr1 = &backgroundIncrustHead;  	ptr2 = &backgroundIncrustHead;  	for (i = 0; i < numEntry; i++) { -		backgroundIncrustStruct *current = -		    (backgroundIncrustStruct *) -		    mallocAndZero(sizeof(backgroundIncrustStruct)); - -		fseek(fileHandle, 4, SEEK_CUR); - -		fread(¤t->objectIdx, 2, 1, fileHandle); -		fread(¤t->type, 2, 1, fileHandle); -		fread(¤t->overlayIdx, 2, 1, fileHandle); -		fread(¤t->X, 2, 1, fileHandle); -		fread(¤t->Y, 2, 1, fileHandle); -		fread(¤t->field_E, 2, 1, fileHandle); -		fread(¤t->scale, 2, 1, fileHandle); -		fread(¤t->backgroundIdx, 2, 1, fileHandle); -		fread(¤t->scriptNumber, 2, 1, fileHandle); -		fread(¤t->scriptOverlayIdx, 2, 1, fileHandle); -		fread(¤t->ptr, 4, 1, fileHandle); -		fread(¤t->field_1C, 4, 1, fileHandle); -		fread(¤t->size, 2, 1, fileHandle); -		fread(¤t->field_22, 2, 1, fileHandle); -		fread(¤t->field_24, 2, 1, fileHandle); -		fread(current->name, 14, 1, fileHandle); -		fread(¤t->aniX, 2, 1, fileHandle); +		backgroundIncrustStruct *current = (backgroundIncrustStruct *)mallocAndZero(sizeof(backgroundIncrustStruct)); + +		currentSaveFile.skip(2); +		currentSaveFile.skip(2); +		 +		current->objectIdx = currentSaveFile.readSint16LE(); +		current->type = currentSaveFile.readSint16LE(); +		current->overlayIdx = currentSaveFile.readSint16LE(); +		current->X = currentSaveFile.readSint16LE(); +		current->Y = currentSaveFile.readSint16LE(); +		current->field_E = currentSaveFile.readSint16LE(); +		current->scale = currentSaveFile.readSint16LE(); +		current->backgroundIdx = currentSaveFile.readSint16LE(); +		current->scriptNumber = currentSaveFile.readSint16LE(); +		current->scriptOverlayIdx = currentSaveFile.readSint16LE(); +		currentSaveFile.skip(4); +		current->field_1C = currentSaveFile.readSint32LE(); +		current->size = currentSaveFile.readSint16LE(); +		current->field_22 = currentSaveFile.readSint16LE(); +		current->field_24 = currentSaveFile.readSint16LE(); +		currentSaveFile.read(current->name, 13); +		currentSaveFile.skip(1); +		current->aniX = currentSaveFile.readSint16LE(); +		currentSaveFile.skip(2);  		if (current->size) {  			current->ptr = (uint8 *) mallocAndZero(current->size); -			fread(current->ptr, current->size, 1, fileHandle); +			currentSaveFile.read(current->ptr, current->size);  		}  		current->next = NULL; diff --git a/engines/cruise/backgroundIncrust.h b/engines/cruise/backgroundIncrust.h index 1e55e366c8..32bf2eaed9 100644 --- a/engines/cruise/backgroundIncrust.h +++ b/engines/cruise/backgroundIncrust.h @@ -47,7 +47,7 @@ struct backgroundIncrustStruct {  	int16 size;  	uint16 field_22;  	uint16 field_24; -	char name[14]; +	char name[13];  	uint16 aniX;  }; @@ -57,7 +57,7 @@ void resetBackgroundIncrustList(backgroundIncrustStruct * pHead);  backgroundIncrustStruct *addBackgroundIncrust(int16 overlayIdx, int16 param2,      backgroundIncrustStruct * pHead, int16 scriptNumber, int16 scriptOverlay,      int16 backgroundIdx, int16 param4); -void loadBackgroundIncrustFromSave(FILE * fileHandle); +void loadBackgroundIncrustFromSave(Common::File& currentSaveFile);  void regenerateBackgroundIncrust(backgroundIncrustStruct * pHead);  void freeBackgroundIncrustList(backgroundIncrustStruct * pHead);  void removeBackgroundIncrust(int overlay, int idx, backgroundIncrustStruct * pHead); diff --git a/engines/cruise/cell.cpp b/engines/cruise/cell.cpp index 6cf84b44f7..9ef2912ef5 100644 --- a/engines/cruise/cell.cpp +++ b/engines/cruise/cell.cpp @@ -22,7 +22,7 @@   * $Id$   *   */ - +#include "common/file.h"  #include "cruise/cell.h"  #include "cruise/cruise_main.h" @@ -44,7 +44,7 @@ void freeMessageList(cellStruct *objPtr) {  	} */  } -void loadSavegameDataSub2(FILE *f) { +void loadSavegameDataSub2(Common::File& currentSaveFile) {  	unsigned short int n_chunks;  	int i;  	cellStruct *p; @@ -53,17 +53,41 @@ void loadSavegameDataSub2(FILE *f) {  	cellHead.next = NULL;	// Not in ASM code, but I guess the variable is defaulted  	// to this value in the .exe -	fread(&n_chunks, 2, 1, f); -	// BIG ENDIAN MACHINES, PLEASE SWAP IT +	n_chunks = currentSaveFile.readSint16LE();  	p = &cellHead;  	for (i = 0; i < n_chunks; i++) {  		t = (cellStruct *) mallocAndZero(sizeof(cellStruct)); -		fseek(f, 4, SEEK_CUR); -		fread(&t->idx, 1, 0x30, f); - +		currentSaveFile.skip(2); +		currentSaveFile.skip(2); + +		t->idx = currentSaveFile.readSint16LE(); +		t->type = currentSaveFile.readSint16LE(); +		t->overlay = currentSaveFile.readSint16LE(); +		t->x = currentSaveFile.readSint16LE(); +		t->field_C = currentSaveFile.readSint16LE(); +		t->spriteIdx = currentSaveFile.readSint16LE(); +		t->color = currentSaveFile.readSint16LE(); +		t->backgroundPlane = currentSaveFile.readSint16LE(); +		t->freeze = currentSaveFile.readSint16LE(); +		t->parent = currentSaveFile.readSint16LE(); +		t->parentOverlay = currentSaveFile.readSint16LE(); +		t->parentType = currentSaveFile.readSint16LE(); +		t->followObjectOverlayIdx = currentSaveFile.readSint16LE(); +		t->followObjectIdx = currentSaveFile.readSint16LE(); +		t->animStart = currentSaveFile.readSint16LE(); +		t->animEnd = currentSaveFile.readSint16LE(); +		t->animWait = currentSaveFile.readSint16LE(); +		t->animStep = currentSaveFile.readSint16LE(); +		t->animChange = currentSaveFile.readSint16LE(); +		t->animType = currentSaveFile.readSint16LE(); +		t->animSignal = currentSaveFile.readSint16LE(); +		t->animCounter = currentSaveFile.readSint16LE(); +		t->animLoop = currentSaveFile.readSint16LE(); +		currentSaveFile.skip(2); +		  		t->next = NULL;  		p->next = t;  		t->prev = cellHead.prev; diff --git a/engines/cruise/cell.h b/engines/cruise/cell.h index 068839d0b9..3806286ca7 100644 --- a/engines/cruise/cell.h +++ b/engines/cruise/cell.h @@ -65,7 +65,7 @@ struct cellStruct {  extern cellStruct cellHead;  void resetPtr(cellStruct * ptr); -void loadSavegameDataSub2(FILE * f); +void loadSavegameDataSub2(Common::File& currentSaveFile);  cellStruct *addCell(cellStruct *pHead, int16 overlayIdx, int16 objIdx, int16 type, int16 backgroundPlane, int16 scriptOverlay, int16 scriptNumber, int16 scriptType);  void createTextObject(cellStruct *pObject, int overlayIdx, int messageIdx, int x, int y, int width, int16 color, int backgroundPlane, int parentOvl, int parentIdx);  void removeCell(cellStruct *objPtr, int ovlNumber, int objectIdx, int objType, int backgroundPlane ); diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp index 73c3ac4ade..a6c4ee1c30 100644 --- a/engines/cruise/cruise_main.cpp +++ b/engines/cruise/cruise_main.cpp @@ -425,7 +425,7 @@ void resetFileEntry(int32 entryNumber) {  	filesDatabase[entryNumber].height = 0;  	filesDatabase[entryNumber].subData.index = -1;  	filesDatabase[entryNumber].subData.resourceType = 0; -	filesDatabase[entryNumber].subData.field_1C = 0; +	filesDatabase[entryNumber].subData.compression = 0;  	filesDatabase[entryNumber].subData.name[0] = 0;  } @@ -859,12 +859,10 @@ menuElementSubStruct *getSelectedEntryInMenu(menuStruct *pMenu) {  bool findRelation(int objOvl, int objIdx, int x, int y) {  	bool found = false;  	bool first = true; -	int testState; +	int testState = -1;  	int j;  	int16 objectState; -	testState = -1; -  	getSingleObjectParam(objOvl, objIdx, 5, &objectState);  	for (j = 1; j < numOfLoadedOverlay; j++) { @@ -919,7 +917,7 @@ bool findRelation(int objOvl, int objIdx, int x, int y) {  						ovl4 = overlayTable[obj2Ovl].ovlData;  					if ((ovl3) && (ptrHead->obj1Number >= 0)) { -						testState = ptrHead->field_1A; +						testState = ptrHead->obj1OldState;  						if ((first) && (ovl3->arrayNameObj) && ((testState ==-1) || (testState == objectState))) {  							char *ptrName = getObjectName(ptrHead->obj1Number, ovl3->arrayNameObj); @@ -1006,7 +1004,7 @@ void callSubRelation(menuElementSubStruct *pMenuElement, int nOvl, int nObj) {  				getMultipleObjectParam(obj2Ovl, pHeader->obj2Number, ¶ms);  			} -			if ((pHeader->field_1C != -1) || (params.scale == pHeader->field_1C)) { +			if ((pHeader->obj2OldState != -1) || (params.scale == pHeader->obj2OldState)) {  				if (pHeader->type == 30) {  					ASSERT(0);  				} else if (pHeader->type == 50) { @@ -1041,24 +1039,24 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {  			if (pHeader->type == 30) {  				attacheNewScriptToTail(&relHead, ovlIdx, pHeader->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL); -				if ((narratorOvl > 0) && (pHeader->field_12 != -1) && (pHeader->field_14 != -1)) { +				if ((narratorOvl > 0) && (pHeader->trackX != -1) && (pHeader->trackY != -1)) {  					actorStruct* pTrack = findActor(&actorHead, narratorOvl, narratorIdx, 0);  					if (pTrack) {  						animationStart = false; -						if (pHeader->field_1E == 9999) { +						if (pHeader->trackDirection == 9999) {  							ASSERT(0); -						} else if ((pHeader->field_12 == 9999) && (pHeader->field_14 == 9999)) { +						} else if ((pHeader->trackX == 9999) && (pHeader->trackY == 9999)) {  							objectParamsQuery naratorParams;  							getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams);  							pTrack->x_dest = naratorParams.X;  							pTrack->y_dest = naratorParams.Y; -							pTrack->endDirection = pHeader->field_1E; +							pTrack->endDirection = pHeader->trackDirection;  						} else { -							pTrack->x_dest = pHeader->field_12; -							pTrack->y_dest = pHeader->field_14; -							pTrack->endDirection = pHeader->field_1E; +							pTrack->x_dest = pHeader->trackX; +							pTrack->y_dest = pHeader->trackY; +							pTrack->endDirection = pHeader->trackDirection;  						}  						pTrack->flag = 1; @@ -1081,9 +1079,9 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {  					getMultipleObjectParam(obj1Ovl, pHeader->obj1Number, ¶ms);  					if (narratorOvl > 0) { -						if ((pHeader->field_12 !=-1) && (pHeader->field_14 != -1) && (pHeader->field_12 != 9999) && (pHeader->field_14 != 9999)) { -							x = pHeader->field_12 - 100; -							y = pHeader->field_14 - 150; +						if ((pHeader->trackX !=-1) && (pHeader->trackY != -1) && (pHeader->trackX != 9999) && (pHeader->trackY != 9999)) { +							x = pHeader->trackX - 100; +							y = pHeader->trackY - 150;  						} else {  							getMultipleObjectParam(narratorOvl, narratorIdx, ¶ms);  							x = params.X - 100; @@ -1094,7 +1092,7 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {  						y = params.Y - 40;  					} -					if (pHeader->field_16 != -1) { +					if (pHeader->obj1NewState != -1) {  						ASSERT(0);  					}  				} @@ -1105,24 +1103,24 @@ void callRelation(menuElementSubStruct *pMenuElement, int nObj2) {  				autoOvl = ovlIdx;  				autoMsg = pHeader->id; -				if ((narratorOvl > 0) && (pHeader->field_12 != -1) && (pHeader->field_14 != -1)) { +				if ((narratorOvl > 0) && (pHeader->trackX != -1) && (pHeader->trackY != -1)) {  					actorStruct* pTrack = findActor(&actorHead, narratorOvl, narratorIdx, 0);  					if (pTrack) {  						animationStart = false; -						if (pHeader->field_1E == 9999) { +						if (pHeader->trackDirection == 9999) {  							ASSERT(0); -						} else if ((pHeader->field_12 == 9999) && (pHeader->field_14 == 9999)) { +						} else if ((pHeader->trackX == 9999) && (pHeader->trackY == 9999)) {  							objectParamsQuery naratorParams;  							getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams);  							pTrack->x_dest = naratorParams.X;  							pTrack->y_dest = naratorParams.Y; -							pTrack->endDirection = pHeader->field_1E; +							pTrack->endDirection = pHeader->trackDirection;  						} else { -							pTrack->x_dest = pHeader->field_12; -							pTrack->y_dest = pHeader->field_14; -							pTrack->endDirection = pHeader->field_1E; +							pTrack->x_dest = pHeader->trackX; +							pTrack->y_dest = pHeader->trackY; +							pTrack->endDirection = pHeader->trackDirection;  						}  						pTrack->flag = 1; @@ -1492,7 +1490,12 @@ void mainLoop(void) {  	autoTrack = 0;  	autoTrack = 0; -	if (initAllData()) { +	initAllData(); + +	// debug code: automaticaly load savegame 0 at startup +	loadSavegameData(0); + +	{  		int playerDontAskQuit = 1;  		int quitValue2 = 1;  		int quitValue = 0; diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp index 6474497954..6d12aecd75 100644 --- a/engines/cruise/dataLoader.cpp +++ b/engines/cruise/dataLoader.cpp @@ -161,7 +161,7 @@ int updateResFileEntry(int height, int width, int entryNumber, int resType) {  	resetFileEntry(entryNumber); -	filesDatabase[entryNumber].subData.field_1C = 0; +	filesDatabase[entryNumber].subData.compression = 0;  	int maskSize = height * width;	// for sprites: width * height @@ -206,7 +206,7 @@ int createResFileEntry(int width, int height, int resType) {  	entryNumber = i; -	filesDatabase[entryNumber].subData.field_1C = 0; +	filesDatabase[entryNumber].subData.compression = 0;  	size = width * height;	// for sprites: width * height diff --git a/engines/cruise/font.cpp b/engines/cruise/font.cpp index ee99567525..66fb405773 100644 --- a/engines/cruise/font.cpp +++ b/engines/cruise/font.cpp @@ -174,8 +174,8 @@ void loadSystemFont(void) {  	colorOfSelectedSaveDrive = 10;  	for (i = 0; i < 64; i++) { -		mediumVar[i].ptr = 0; -		mediumVar[i].field_1C = 0; +		mediumVar[i].ptr = NULL; +		mediumVar[i].nofree = 0;  	}  	initVar1 = 0; diff --git a/engines/cruise/overlay.h b/engines/cruise/overlay.h index 75f0e7a64b..cd0cf8891f 100644 --- a/engines/cruise/overlay.h +++ b/engines/cruise/overlay.h @@ -72,18 +72,22 @@ struct linkDataStruct {  	int16 offsetVerbeName;  	int16 verbOverlay;  	int16 verbNumber; +  	int16 obj1Overlay;  	int16 obj1Number;  	int16 obj2Overlay;  	int16 obj2Number; -	int16 field_12; -	int16 field_14; -	int16 field_16; -	int16 field_18; -	int16 field_1A; -	int16 field_1C; -	int16 field_1E; +	int16 trackX; +	int16 trackY; + +	int16 obj1NewState; +	int16 obj2NewState; + +	int16 obj1OldState; +	int16 obj2OldState; + +	int16 trackDirection;  	int16 field_20;  }; @@ -135,8 +139,10 @@ struct ovlDataStruct {  	uint8 *arrayNameObj;  	uint8 *arrayNameRelocGlob;  	uint8 *arrayNameSymbGlob; +  	uint8 *data4Ptr;  	uint8 *ptr8; +  	unsigned short int numProc;  	unsigned short int numRel;  	unsigned short int numSymbGlob; @@ -146,6 +152,7 @@ struct ovlDataStruct {  	unsigned short int numStrings;  	unsigned short int size8;  	unsigned short int size9; +  	unsigned short int nameExportSize;  	unsigned short int exportNamesSize;  	unsigned short int specialString2Length; @@ -156,27 +163,14 @@ struct ovlDataStruct {  };  struct overlayStruct { -	char overlayName[14]; +	char overlayName[13];  	ovlDataStruct *ovlData;  	short int alreadyLoaded; -	char state; -	char field_15; -	char field_16; -	char field_17; -	char field_18; -	char field_19; -	char field_1A; -	char field_1B; -	char field_1C; -	char field_1D; -	char field_1E; -	char field_1F; -	char field_20; -	char field_21; -	char field_22; -	char field_23; -	char field_24; -	char field_25; +	short int state; +	char* pDebug; +	long int debugSize; +	char* pSource; +	long int sourceSize;  	short int executeScripts;  }; 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);  		} diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index 833ea1e24c..16adef5135 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -425,7 +425,7 @@ int32 opcodeType6(void) {  		si |= 2;  	} -	currentScriptPtr->bitMask = si; +	currentScriptPtr->ccr = si;  	return (0);  } @@ -444,7 +444,7 @@ int32 opcodeType5(void) {  	int offset = currentScriptPtr->var4;  	int short1 = getShortFromScript();  	int newSi = short1 + offset; -	int bitMask = currentScriptPtr->bitMask; +	int bitMask = currentScriptPtr->ccr;  	switch (currentScriptOpcodeType) {  	case 0: diff --git a/engines/cruise/script.h b/engines/cruise/script.h index ae7ca02c77..1868576686 100644 --- a/engines/cruise/script.h +++ b/engines/cruise/script.h @@ -37,6 +37,7 @@ enum scriptTypeEnum {  struct scriptInstanceStruct {  	struct scriptInstanceStruct *nextScriptPtr; +	int16 ccr;  	int16 var4;  	uint8 *var6;  	int16 varA; @@ -48,8 +49,6 @@ struct scriptInstanceStruct {  	int16 var16;  	int16 var18;  	int16 var1A; -////// EXTRA ! not in original code. Needed for cross platform. -	int16 bitMask;  };  extern scriptInstanceStruct relHead; diff --git a/engines/cruise/vars.h b/engines/cruise/vars.h index 5f89a4f841..b7a6b3dfb4 100644 --- a/engines/cruise/vars.h +++ b/engines/cruise/vars.h @@ -69,15 +69,13 @@ extern int16 main5;  extern int16 var22;  struct mediumVarStruct { -	uint8 name[16]; -	int16 field_10; -	int16 field_12; -	int16 field_14; -	int16 field_16; +	uint8 name[15]; +	int32 size; +	int32 sourceSize;  	uint8 *ptr; -	int16 field_1C; -	int16 field_1E; -	int16 field_20; +	int16 nofree; +	int16 protect; +	int16 ovl;  };  struct filesDataStruct { @@ -123,19 +121,18 @@ struct fileEntry {  struct dataFileEntrySub {  	uint8 *ptr;  	int16 index;		// sprite index -	char name[14]; +	char name[13];  	int16 transparency;	// sprite transparency  	uint8 *ptrMask;  	uint8 resourceType;	// sprite and image type 2,4,8 , fnt = 7, spl = 6 -	uint8 field_1B; -	int16 field_1C; +	int16 compression;  };  struct dataFileEntry { -	int16 widthInColumn; -	int16 width; -	int16 resType; -	int16 height; +	uint16 widthInColumn; +	uint16 width; +	uint16 resType; +	uint16 height;  	dataFileEntrySub subData;  }; | 
