Cleanup load savegame from original interpreter

svn-id: r29453
This commit is contained in:
Vincent Hamm 2007-11-08 22:59:29 +00:00
parent c2594cb3f2
commit 783a0bf67d
12 changed files with 331 additions and 256 deletions

View file

@ -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));
backgroundIncrustStruct *current = (backgroundIncrustStruct *)mallocAndZero(sizeof(backgroundIncrustStruct));
fseek(fileHandle, 4, SEEK_CUR);
currentSaveFile.skip(2);
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);
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;

View file

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

View file

@ -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,16 +53,40 @@ 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;

View file

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

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

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

View file

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

View file

@ -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:

View file

@ -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;

View file

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