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

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