[Scummvm-cvs-logs] SF.net SVN: scummvm: [29453] scummvm/trunk/engines/cruise

yazoo at users.sourceforge.net yazoo at users.sourceforge.net
Thu Nov 8 23:59:29 CET 2007


Revision: 29453
          http://scummvm.svn.sourceforge.net/scummvm/?rev=29453&view=rev
Author:   yazoo
Date:     2007-11-08 14:59:29 -0800 (Thu, 08 Nov 2007)

Log Message:
-----------
Cleanup load savegame from original interpreter

Modified Paths:
--------------
    scummvm/trunk/engines/cruise/backgroundIncrust.cpp
    scummvm/trunk/engines/cruise/backgroundIncrust.h
    scummvm/trunk/engines/cruise/cell.cpp
    scummvm/trunk/engines/cruise/cell.h
    scummvm/trunk/engines/cruise/cruise_main.cpp
    scummvm/trunk/engines/cruise/dataLoader.cpp
    scummvm/trunk/engines/cruise/font.cpp
    scummvm/trunk/engines/cruise/overlay.h
    scummvm/trunk/engines/cruise/saveload.cpp
    scummvm/trunk/engines/cruise/script.cpp
    scummvm/trunk/engines/cruise/script.h
    scummvm/trunk/engines/cruise/vars.h

Modified: scummvm/trunk/engines/cruise/backgroundIncrust.cpp
===================================================================
--- scummvm/trunk/engines/cruise/backgroundIncrust.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/backgroundIncrust.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -135,45 +135,46 @@
 	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));
+		backgroundIncrustStruct *current = (backgroundIncrustStruct *)mallocAndZero(sizeof(backgroundIncrustStruct));
 
-		fseek(fileHandle, 4, SEEK_CUR);
+		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);
 
-		fread(&current->objectIdx, 2, 1, fileHandle);
-		fread(&current->type, 2, 1, fileHandle);
-		fread(&current->overlayIdx, 2, 1, fileHandle);
-		fread(&current->X, 2, 1, fileHandle);
-		fread(&current->Y, 2, 1, fileHandle);
-		fread(&current->field_E, 2, 1, fileHandle);
-		fread(&current->scale, 2, 1, fileHandle);
-		fread(&current->backgroundIdx, 2, 1, fileHandle);
-		fread(&current->scriptNumber, 2, 1, fileHandle);
-		fread(&current->scriptOverlayIdx, 2, 1, fileHandle);
-		fread(&current->ptr, 4, 1, fileHandle);
-		fread(&current->field_1C, 4, 1, fileHandle);
-		fread(&current->size, 2, 1, fileHandle);
-		fread(&current->field_22, 2, 1, fileHandle);
-		fread(&current->field_24, 2, 1, fileHandle);
-		fread(current->name, 14, 1, fileHandle);
-		fread(&current->aniX, 2, 1, fileHandle);
-
 		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;

Modified: scummvm/trunk/engines/cruise/backgroundIncrust.h
===================================================================
--- scummvm/trunk/engines/cruise/backgroundIncrust.h	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/backgroundIncrust.h	2007-11-08 22:59:29 UTC (rev 29453)
@@ -47,7 +47,7 @@
 	int16 size;
 	uint16 field_22;
 	uint16 field_24;
-	char name[14];
+	char name[13];
 	uint16 aniX;
 };
 
@@ -57,7 +57,7 @@
 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);

Modified: scummvm/trunk/engines/cruise/cell.cpp
===================================================================
--- scummvm/trunk/engines/cruise/cell.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/cell.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -22,7 +22,7 @@
  * $Id$
  *
  */
-
+#include "common/file.h"
 #include "cruise/cell.h"
 #include "cruise/cruise_main.h"
 
@@ -44,7 +44,7 @@
 	} */
 }
 
-void loadSavegameDataSub2(FILE *f) {
+void loadSavegameDataSub2(Common::File& currentSaveFile) {
 	unsigned short int n_chunks;
 	int i;
 	cellStruct *p;
@@ -53,17 +53,41 @@
 	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;

Modified: scummvm/trunk/engines/cruise/cell.h
===================================================================
--- scummvm/trunk/engines/cruise/cell.h	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/cell.h	2007-11-08 22:59:29 UTC (rev 29453)
@@ -65,7 +65,7 @@
 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 );

Modified: scummvm/trunk/engines/cruise/cruise_main.cpp
===================================================================
--- scummvm/trunk/engines/cruise/cruise_main.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/cruise_main.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -425,7 +425,7 @@
 	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 @@
 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 @@
 						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 @@
 				getMultipleObjectParam(obj2Ovl, pHeader->obj2Number, &params);
 			}
 
-			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 @@
 			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 @@
 					getMultipleObjectParam(obj1Ovl, pHeader->obj1Number, &params);
 
 					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, &params);
 							x = params.X - 100;
@@ -1094,7 +1092,7 @@
 						y = params.Y - 40;
 					}
 
-					if (pHeader->field_16 != -1) {
+					if (pHeader->obj1NewState != -1) {
 						ASSERT(0);
 					}
 				}
@@ -1105,24 +1103,24 @@
 				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 @@
 	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;

Modified: scummvm/trunk/engines/cruise/dataLoader.cpp
===================================================================
--- scummvm/trunk/engines/cruise/dataLoader.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/dataLoader.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -161,7 +161,7 @@
 
 	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 @@
 
 	entryNumber = i;
 
-	filesDatabase[entryNumber].subData.field_1C = 0;
+	filesDatabase[entryNumber].subData.compression = 0;
 
 	size = width * height;	// for sprites: width * height
 

Modified: scummvm/trunk/engines/cruise/font.cpp
===================================================================
--- scummvm/trunk/engines/cruise/font.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/font.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -174,8 +174,8 @@
 	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;

Modified: scummvm/trunk/engines/cruise/overlay.h
===================================================================
--- scummvm/trunk/engines/cruise/overlay.h	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/overlay.h	2007-11-08 22:59:29 UTC (rev 29453)
@@ -72,18 +72,22 @@
 	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 @@
 	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 @@
 	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 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;
 };
 

Modified: scummvm/trunk/engines/cruise/saveload.cpp
===================================================================
--- scummvm/trunk/engines/cruise/saveload.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/saveload.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -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 @@
 		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,21 +96,40 @@
 	}
 }
 
-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;
 		current->prev = actorHead.prev;
@@ -119,46 +138,42 @@
 	}
 }
 
-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 @@
 
 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 @@
 
 	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);
+	narratorOvl = currentSaveFile.readSint16LE();
+	narratorIdx = currentSaveFile.readSint16LE();
+	aniX = currentSaveFile.readSint16LE();
+	aniY = currentSaveFile.readSint16LE();
 
-	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);
+	if(currentSaveFile.readSint16LE()) // cast to bool
+		animationStart = true;
+	else
+		animationStart = false;
 
-	loadSavegameDataSub1(fileHandle);
-	loadScriptsFromSave(fileHandle, &procHead);
-	loadScriptsFromSave(fileHandle, &relHead);
+	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();
 
-	loadSavegameDataSub2(fileHandle);
-	loadBackgroundIncrustFromSave(fileHandle);
-	loadSavegameActor(fileHandle);
-	loadSavegameDataSub5(fileHandle);
-	loadSavegameDataSub6(fileHandle);
+	currentSaveFile.read(var50, 64);
+	currentSaveFile.read(var50, 64); // Hu ? why 2 times ?
 
-	fclose(fileHandle);	// finished with loading !!!!! Yatta !
+	// here code seems bogus... this should read music name and it may be a buffer overrun
+	currentSaveFile.skip(21);
 
-	for (j = 0; j < 64; j++) {
+	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 @@
 
 	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 @@
 				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 @@
 
 	while (currentcellHead) {
 		if (currentcellHead->type == 5) {
-			uint8 *ptr =
-			    mainProc14(currentcellHead->overlay,
+			uint8 *ptr = mainProc14(currentcellHead->overlay,
 			    currentcellHead->idx);
 
 			ASSERT(0);
@@ -394,7 +451,7 @@
 	//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);
 		}

Modified: scummvm/trunk/engines/cruise/script.cpp
===================================================================
--- scummvm/trunk/engines/cruise/script.cpp	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/script.cpp	2007-11-08 22:59:29 UTC (rev 29453)
@@ -425,7 +425,7 @@
 		si |= 2;
 	}
 
-	currentScriptPtr->bitMask = si;
+	currentScriptPtr->ccr = si;
 
 	return (0);
 }
@@ -444,7 +444,7 @@
 	int offset = currentScriptPtr->var4;
 	int short1 = getShortFromScript();
 	int newSi = short1 + offset;
-	int bitMask = currentScriptPtr->bitMask;
+	int bitMask = currentScriptPtr->ccr;
 
 	switch (currentScriptOpcodeType) {
 	case 0:

Modified: scummvm/trunk/engines/cruise/script.h
===================================================================
--- scummvm/trunk/engines/cruise/script.h	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/script.h	2007-11-08 22:59:29 UTC (rev 29453)
@@ -37,6 +37,7 @@
 
 struct scriptInstanceStruct {
 	struct scriptInstanceStruct *nextScriptPtr;
+	int16 ccr;
 	int16 var4;
 	uint8 *var6;
 	int16 varA;
@@ -48,8 +49,6 @@
 	int16 var16;
 	int16 var18;
 	int16 var1A;
-////// EXTRA ! not in original code. Needed for cross platform.
-	int16 bitMask;
 };
 
 extern scriptInstanceStruct relHead;

Modified: scummvm/trunk/engines/cruise/vars.h
===================================================================
--- scummvm/trunk/engines/cruise/vars.h	2007-11-08 11:55:51 UTC (rev 29452)
+++ scummvm/trunk/engines/cruise/vars.h	2007-11-08 22:59:29 UTC (rev 29453)
@@ -69,15 +69,13 @@
 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 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;
 };
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list