aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Hamm2007-11-08 22:59:29 +0000
committerVincent Hamm2007-11-08 22:59:29 +0000
commit783a0bf67d7319f291202a739bfaf82b77295448 (patch)
tree9b2fef6af76108377a02886ecd24f067bc36845b
parentc2594cb3f2675021537008b9501291004316802f (diff)
downloadscummvm-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.cpp53
-rw-r--r--engines/cruise/backgroundIncrust.h4
-rw-r--r--engines/cruise/cell.cpp38
-rw-r--r--engines/cruise/cell.h2
-rw-r--r--engines/cruise/cruise_main.cpp53
-rw-r--r--engines/cruise/dataLoader.cpp4
-rw-r--r--engines/cruise/font.cpp4
-rw-r--r--engines/cruise/overlay.h46
-rw-r--r--engines/cruise/saveload.cpp363
-rw-r--r--engines/cruise/script.cpp4
-rw-r--r--engines/cruise/script.h3
-rw-r--r--engines/cruise/vars.h27
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(&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);
+ 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, &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 @@ 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, &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 @@ 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(&currentActiveBackgroundPlane, 2, 1, fileHandle);
- fread(&initVar3, 2, 1, fileHandle);
- fread(&initVar2, 2, 1, fileHandle);
- fread(&var22, 2, 1, fileHandle);
- fread(&main5, 2, 1, fileHandle);
- fread(&numOfLoadedOverlay, 2, 1, fileHandle);
- fread(&setup1, 2, 1, fileHandle);
- fread(&fontFileIndex, 2, 1, fileHandle);
- fread(&currentActiveMenu, 2, 1, fileHandle);
- fread(&userWait, 2, 1, fileHandle); // ok
- fread(&autoOvl, 2, 1, fileHandle);
- fread(&autoMsg, 2, 1, fileHandle);
- fread(&autoTrack, 2, 1, fileHandle);
- fread(&var39, 2, 1, fileHandle);
- fread(&var42, 2, 1, fileHandle);
- fread(&var45, 2, 1, fileHandle);
- fread(&var46, 2, 1, fileHandle);
- fread(&var47, 2, 1, fileHandle);
- fread(&var48, 2, 1, fileHandle);
- fread(&flagCt, 2, 1, fileHandle);
- fread(&var41, 2, 1, fileHandle);
- fread(&entrerMenuJoueur, 2, 1, fileHandle);
-
- fread(var50, 64, 1, fileHandle);
- fread(var50, 64, 1, fileHandle); // Hu ? why 2 times ?
- fread(&systemStrings, sizeof(systemStrings), 1, fileHandle); // ok
- fread(currentCtpName, 40, 1, fileHandle);
- fread(backgroundTable, 120, 1, fileHandle);
- fread(palette, 256, 2, fileHandle); // ok
- fread(initVar5, 24, 1, fileHandle);
- fread(globalVars, setup1 * 2, 1, fileHandle);
- fread(filesDatabase, 9766, 1, fileHandle);
- fread(overlayTable, 40 * numOfLoadedOverlay, 1, fileHandle); // ok
- fread(mediumVar, 0x880, 1, fileHandle);
-
- loadSavegameDataSub1(fileHandle);
- loadScriptsFromSave(fileHandle, &procHead);
- loadScriptsFromSave(fileHandle, &relHead);
-
- loadSavegameDataSub2(fileHandle);
- loadBackgroundIncrustFromSave(fileHandle);
- loadSavegameActor(fileHandle);
- loadSavegameDataSub5(fileHandle);
- loadSavegameDataSub6(fileHandle);
-
- fclose(fileHandle); // finished with loading !!!!! Yatta !
-
- for (j = 0; j < 64; j++) {
+ narratorOvl = currentSaveFile.readSint16LE();
+ narratorIdx = currentSaveFile.readSint16LE();
+ aniX = currentSaveFile.readSint16LE();
+ aniY = currentSaveFile.readSint16LE();
+
+ if(currentSaveFile.readSint16LE()) // cast to bool
+ animationStart = true;
+ else
+ animationStart = false;
+
+ currentActiveBackgroundPlane = currentSaveFile.readSint16LE();
+ initVar3 = currentSaveFile.readSint16LE();
+ initVar2 = currentSaveFile.readSint16LE();
+ var22 = currentSaveFile.readSint16LE();
+ main5 = currentSaveFile.readSint16LE();
+ numOfLoadedOverlay = currentSaveFile.readSint16LE();
+ setup1 = currentSaveFile.readSint16LE();
+ fontFileIndex = currentSaveFile.readSint16LE();
+ currentActiveMenu = currentSaveFile.readSint16LE();
+ userWait = currentSaveFile.readSint16LE();
+ autoOvl = currentSaveFile.readSint16LE();
+ autoMsg = currentSaveFile.readSint16LE();
+ autoTrack = currentSaveFile.readSint16LE();
+ var39 = currentSaveFile.readSint16LE();
+ var42 = currentSaveFile.readSint16LE();
+ var45 = currentSaveFile.readSint16LE();
+ var46 = currentSaveFile.readSint16LE();
+ var47 = currentSaveFile.readSint16LE();
+ var48 = currentSaveFile.readSint16LE();
+ flagCt = currentSaveFile.readSint16LE();
+ var41 = currentSaveFile.readSint16LE();
+ entrerMenuJoueur = currentSaveFile.readSint16LE();
+
+ currentSaveFile.read(var50, 64);
+ currentSaveFile.read(var50, 64); // Hu ? why 2 times ?
+
+ // here code seems bogus... this should read music name and it may be a buffer overrun
+ currentSaveFile.skip(21);
+
+ currentSaveFile.read(currentCtpName, 40);
+
+ // restore backgroundTable
+ for(int i=0; i<8; i++)
+ {
+ currentSaveFile.read(backgroundTable[i].name, 9);
+ currentSaveFile.read(backgroundTable[i].extention, 6);
+ }
+
+ currentSaveFile.read(palette, 256*2);
+ currentSaveFile.read(initVar5, 24);
+ currentSaveFile.read(globalVars, setup1 * 2); // ok
+ for(int i=0; i<257; i++)
+ {
+ filesDatabase[i].widthInColumn = currentSaveFile.readUint16LE();
+ filesDatabase[i].width = currentSaveFile.readUint16LE();
+ filesDatabase[i].resType = currentSaveFile.readUint16LE();
+ filesDatabase[i].height = currentSaveFile.readUint16LE();
+ filesDatabase[i].subData.ptr = (uint8*)currentSaveFile.readSint32LE();
+ filesDatabase[i].subData.index = currentSaveFile.readSint16LE();
+ currentSaveFile.read(filesDatabase[i].subData.name, 13);
+ currentSaveFile.skip(1);
+ filesDatabase[i].subData.transparency = currentSaveFile.readSint16LE();
+ filesDatabase[i].subData.ptrMask = (uint8*)currentSaveFile.readSint32LE();
+ filesDatabase[i].subData.resourceType = currentSaveFile.readByte();
+ currentSaveFile.skip(1);
+ filesDatabase[i].subData.compression = currentSaveFile.readSint16LE();
+ }
+
+ for(int i=0; i<numOfLoadedOverlay; i++)
+ {
+ currentSaveFile.read(overlayTable[i].overlayName, 13);
+ currentSaveFile.skip(1);
+ currentSaveFile.skip(4);
+ overlayTable[i].alreadyLoaded = currentSaveFile.readSint16LE();
+ overlayTable[i].state = currentSaveFile.readSint16LE();
+ currentSaveFile.skip(4);
+ currentSaveFile.skip(4);
+ currentSaveFile.skip(4);
+ currentSaveFile.skip(4);
+ overlayTable[i].executeScripts = currentSaveFile.readSint16LE();
+ }
+
+ for(int i=0; i<64; i++)
+ {
+ currentSaveFile.read(mediumVar[i].name, 15);
+ currentSaveFile.skip(1);
+ mediumVar[i].size = currentSaveFile.readSint32LE();
+ mediumVar[i].sourceSize = currentSaveFile.readSint32LE();
+ currentSaveFile.skip(4);
+ mediumVar[i].nofree = currentSaveFile.readSint16LE();
+ mediumVar[i].protect = currentSaveFile.readSint16LE();
+ mediumVar[i].ovl = currentSaveFile.readSint16LE();
+ }
+
+ loadSavegameDataSub1(currentSaveFile);
+ loadScriptsFromSave(currentSaveFile, &procHead);
+ loadScriptsFromSave(currentSaveFile, &relHead);
+
+ loadSavegameDataSub2(currentSaveFile);
+ loadBackgroundIncrustFromSave(currentSaveFile);
+ loadSavegameActor(currentSaveFile);
+ loadSavegameDataSub5(currentSaveFile);
+ loadSavegameDataSub6(currentSaveFile);
+
+ currentSaveFile.close();
+
+ for (int j = 0; j < 64; j++) {
mediumVar[j].ptr = NULL;
}
- for (j = 1; j < numOfLoadedOverlay; j++) {
+ for (int j = 1; j < numOfLoadedOverlay; j++) {
if (overlayTable[j].alreadyLoaded) {
overlayTable[j].alreadyLoaded = 0;
loadOverlay((uint8 *) overlayTable[j].overlayName);
if (overlayTable[j].alreadyLoaded) {
- ovlDataStruct *ovlData =
- overlayTable[j].ovlData;
+ ovlDataStruct *ovlData = overlayTable[j].ovlData;
if (filesData[j].field_0) {
if (ovlData->data4Ptr) {
free(ovlData->data4Ptr);
}
- ovlData->data4Ptr =
- (uint8 *) filesData[j].field_0;
- ovlData->sizeOfData4 =
- filesData2[j].field_0;
+ ovlData->data4Ptr = (uint8 *) filesData[j].field_0;
+ ovlData->sizeOfData4 = filesData2[j].field_0;
}
if (filesData[j].field_4) {
if (ovlData->arrayObjVar) {
- free(ovlData->
- arrayObjVar);
+ free(ovlData->arrayObjVar);
}
ovlData->arrayObjVar = (objectParams *) filesData[j].field_4; // TODO: fix !
@@ -320,17 +383,14 @@ int loadSavegameData(int saveGameIdx) {
initVar1Save = initVar1;
- for (j = 0; j < 257; j++) {
+ for (int j = 0; j < 257; j++) {
if (filesDatabase[j].subData.ptr) {
int i;
int k;
for (i = j + 1; i < 257; i++) {
if (filesDatabase[i].subData.ptr) {
- if (strcmpuint8(filesDatabase[j].
- subData.name,
- filesDatabase[i].subData.
- name)) {
+ if (strcmpuint8(filesDatabase[j].subData.name, filesDatabase[i].subData.name)) {
break;
}
} else {
@@ -351,9 +411,7 @@ int loadSavegameData(int saveGameIdx) {
exit(1);
//loadFileMode1(filesDatabase[j].subData.name,filesDatabase[j].subData.var4);
} else {
- loadFileMode2((uint8 *) filesDatabase[j].
- subData.name,
- filesDatabase[j].subData.index, j, i - j);
+ loadFileMode2((uint8 *) filesDatabase[j].subData.name, filesDatabase[j].subData.index, j, i - j);
j = i - 1;
}
@@ -367,8 +425,7 @@ int loadSavegameData(int saveGameIdx) {
while (currentcellHead) {
if (currentcellHead->type == 5) {
- uint8 *ptr =
- mainProc14(currentcellHead->overlay,
+ uint8 *ptr = mainProc14(currentcellHead->overlay,
currentcellHead->idx);
ASSERT(0);
@@ -394,7 +451,7 @@ int loadSavegameData(int saveGameIdx) {
//prepareFadeOut();
//gfxModuleData.gfxFunction8();
- for (j = 0; j < 8; j++) {
+ for (int j = 0; j < 8; j++) {
if (strlen((char *)backgroundTable[j].name)) {
loadBackground(backgroundTable[j].name, j);
}
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;
};