From 783a0bf67d7319f291202a739bfaf82b77295448 Mon Sep 17 00:00:00 2001 From: Vincent Hamm Date: Thu, 8 Nov 2007 22:59:29 +0000 Subject: Cleanup load savegame from original interpreter svn-id: r29453 --- engines/cruise/backgroundIncrust.cpp | 53 ++--- engines/cruise/backgroundIncrust.h | 4 +- engines/cruise/cell.cpp | 38 +++- engines/cruise/cell.h | 2 +- engines/cruise/cruise_main.cpp | 53 ++--- engines/cruise/dataLoader.cpp | 4 +- engines/cruise/font.cpp | 4 +- engines/cruise/overlay.h | 46 ++--- engines/cruise/saveload.cpp | 363 ++++++++++++++++++++--------------- engines/cruise/script.cpp | 4 +- engines/cruise/script.h | 3 +- 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; idata4Ptr) { 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; }; -- cgit v1.2.3