2007-05-30 21:56:52 +00:00
|
|
|
|
/* ScummVM - Graphic Adventure Engine
|
2007-04-27 12:58:35 +00:00
|
|
|
|
*
|
2007-05-30 21:56:52 +00:00
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
|
* file distributed with this source distribution.
|
2007-04-27 12:58:35 +00:00
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*
|
|
|
|
|
* $URL$
|
|
|
|
|
* $Id$
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "cruise/cruise_main.h"
|
|
|
|
|
|
|
|
|
|
namespace Cruise {
|
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
void loadSavegameDataSub1(FILE *fileHandle) {
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < numOfLoadedOverlay; i++) {
|
|
|
|
|
filesData[i].field_4 = NULL;
|
|
|
|
|
filesData[i].field_0 = NULL;
|
|
|
|
|
filesData2[i].field_0 = 0;
|
|
|
|
|
|
|
|
|
|
if (overlayTable[i].alreadyLoaded) {
|
|
|
|
|
fread(&filesData2[i].field_0, 2, 1, fileHandle);
|
|
|
|
|
|
|
|
|
|
if (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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fread(&filesData2[i].field_2, 2, 1, fileHandle);
|
|
|
|
|
|
|
|
|
|
if (filesData2[i].field_2) {
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-04-27 12:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
void loadScriptsFromSave(FILE *fileHandle, scriptInstanceStruct *entry) {
|
|
|
|
|
short int numScripts;
|
|
|
|
|
int i;
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
fread(&numScripts, 2, 1, fileHandle);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
for (i = 0; i < numScripts; i++) {
|
|
|
|
|
scriptInstanceStruct *ptr =
|
|
|
|
|
(scriptInstanceStruct *)
|
|
|
|
|
mallocAndZero(sizeof(scriptInstanceStruct));
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
fread(ptr, 0x1C, 1, fileHandle); // use 0x1C as our scriptInstanceStruct is bigger than in original because of cross platform problems
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
fread(&ptr->varA, 2, 1, fileHandle);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
if (ptr->varA) {
|
|
|
|
|
ptr->var6 = (uint8 *) mallocAndZero(ptr->varA);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
fread(ptr->var6, ptr->varA, 1, fileHandle);
|
|
|
|
|
}
|
|
|
|
|
/////////
|
|
|
|
|
ptr->bitMask = *((int16 *) ptr + 1);
|
|
|
|
|
/////////
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
ptr->nextScriptPtr = 0;
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
entry->nextScriptPtr = ptr;
|
|
|
|
|
entry = ptr;
|
|
|
|
|
}
|
2007-04-27 12:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
void loadSavegameActor(FILE *fileHandle) {
|
|
|
|
|
short int numEntry;
|
|
|
|
|
actorStruct *ptr;
|
|
|
|
|
int i;
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
fread(&numEntry, 2, 1, fileHandle);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
ptr = &actorHead;
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
for (i = 0; i < numEntry; i++) {
|
|
|
|
|
actorStruct *current =
|
|
|
|
|
(actorStruct *) mallocAndZero(sizeof(actorStruct));
|
|
|
|
|
fseek(fileHandle, 4, SEEK_CUR);
|
|
|
|
|
fread(current, 0x26, 1, fileHandle);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
current->next = NULL;
|
|
|
|
|
ptr->next = current;
|
|
|
|
|
current->prev = actorHead.prev;
|
|
|
|
|
actorHead.prev = current;
|
|
|
|
|
ptr = current->next;
|
|
|
|
|
}
|
2007-04-27 12:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
void loadSavegameDataSub5(FILE *fileHandle) {
|
|
|
|
|
if (var1) {
|
|
|
|
|
fread(&saveVar1, 1, 1, fileHandle);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
if (saveVar1) {
|
|
|
|
|
fread(saveVar2, saveVar1, 1, fileHandle);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
fread(&saveVar1, 1, 1, fileHandle);
|
|
|
|
|
}
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
void loadSavegameDataSub6(FILE *fileHandle) {
|
|
|
|
|
int32 var;
|
|
|
|
|
|
|
|
|
|
fread(&var, 4, 1, fileHandle);
|
|
|
|
|
flipLong(&var);
|
|
|
|
|
|
|
|
|
|
if (var) {
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
fread(&numberOfWalkboxes, 2, 1, fileHandle);
|
|
|
|
|
|
|
|
|
|
if (numberOfWalkboxes) {
|
|
|
|
|
fread(walkboxType, numberOfWalkboxes * 2, 1,
|
|
|
|
|
fileHandle);
|
|
|
|
|
fread(walkboxType, numberOfWalkboxes * 2, 1,
|
|
|
|
|
fileHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
|
|
fread(&persoTable[i], 4, 1, fileHandle);
|
|
|
|
|
|
|
|
|
|
if (persoTable[i]) {
|
|
|
|
|
assert(sizeof(persoStruct) == 0x6AA);
|
|
|
|
|
persoTable[i] =
|
|
|
|
|
(persoStruct *)
|
|
|
|
|
mallocAndZero(sizeof(persoStruct));
|
|
|
|
|
fread(persoTable[i], 0x6AA, 1, fileHandle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2007-04-27 12:58:35 +00:00
|
|
|
|
|
2007-04-27 22:33:45 +00:00
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
if (!fileHandle) {
|
|
|
|
|
printInfoBlackBox("Sauvegarde non trouv<75>e...");
|
|
|
|
|
waitForPlayerInput();
|
|
|
|
|
return (-1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printInfoBlackBox("Chargement en cours...");
|
|
|
|
|
|
|
|
|
|
fread(saveIdentBuffer, 6, 1, fileHandle);
|
|
|
|
|
|
|
|
|
|
if (strcmp(saveIdentBuffer, "SAVPC")) {
|
|
|
|
|
fclose(fileHandle);
|
|
|
|
|
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(&var6, 2, 1, fileHandle);
|
|
|
|
|
fread(&var7, 2, 1, fileHandle);
|
|
|
|
|
fread(&var8, 2, 1, fileHandle);
|
|
|
|
|
fread(&userDelay, 2, 1, fileHandle);
|
|
|
|
|
fread(&sysKey, 2, 1, fileHandle);
|
|
|
|
|
fread(&var11, 2, 1, fileHandle);
|
|
|
|
|
fread(&var12, 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);
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
fread(&var30, 2, 1, fileHandle);
|
|
|
|
|
fread(&var31, 2, 1, fileHandle);
|
|
|
|
|
fread(&var34, 2, 1, fileHandle);
|
|
|
|
|
fread(&var35, 2, 1, fileHandle);
|
|
|
|
|
int16 bTemp;
|
|
|
|
|
fread(&bTemp, 2, 1, fileHandle);
|
2007-04-28 07:21:28 +00:00
|
|
|
|
animationStart = bTemp != 0;
|
2007-04-27 22:33:45 +00:00
|
|
|
|
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(&main7, 2, 1, fileHandle); // ok
|
|
|
|
|
fread(&main17, 2, 1, fileHandle);
|
|
|
|
|
fread(&main14, 2, 1, fileHandle);
|
|
|
|
|
fread(&main8, 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);
|
2007-04-28 22:31:55 +00:00
|
|
|
|
loadScriptsFromSave(fileHandle, &procHead);
|
|
|
|
|
loadScriptsFromSave(fileHandle, &relHead);
|
2007-04-27 22:33:45 +00:00
|
|
|
|
|
|
|
|
|
loadSavegameDataSub2(fileHandle);
|
|
|
|
|
loadBackgroundIncrustFromSave(fileHandle);
|
|
|
|
|
loadSavegameActor(fileHandle);
|
|
|
|
|
loadSavegameDataSub5(fileHandle);
|
|
|
|
|
loadSavegameDataSub6(fileHandle);
|
|
|
|
|
|
|
|
|
|
fclose(fileHandle); // finished with loading !!!!! Yatta !
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < 64; j++) {
|
|
|
|
|
mediumVar[j].ptr = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (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;
|
|
|
|
|
|
|
|
|
|
if (filesData[j].field_0) {
|
|
|
|
|
if (ovlData->data4Ptr) {
|
|
|
|
|
free(ovlData->data4Ptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ovlData->data4Ptr =
|
|
|
|
|
(uint8 *) filesData[j].field_0;
|
|
|
|
|
ovlData->sizeOfData4 =
|
|
|
|
|
filesData2[j].field_0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (filesData[j].field_4) {
|
|
|
|
|
if (ovlData->objData2WorkTable) {
|
|
|
|
|
free(ovlData->
|
|
|
|
|
objData2WorkTable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ovlData->objData2WorkTable = (objectParams *) filesData[j].field_4; // TODO: fix !
|
|
|
|
|
ovlData->size9 = filesData2[j].field_2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateAllScriptsImports();
|
|
|
|
|
|
|
|
|
|
saveVar6[0] = 0;
|
|
|
|
|
|
|
|
|
|
initVar1Save = initVar1;
|
|
|
|
|
|
|
|
|
|
for (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)) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (k = j; k < i; k++) {
|
|
|
|
|
if (filesDatabase[k].subData.ptr2)
|
|
|
|
|
initVar1 = 0;
|
|
|
|
|
|
|
|
|
|
filesDatabase[k].subData.ptr = NULL;
|
|
|
|
|
filesDatabase[k].subData.ptr2 = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (i < 2) {
|
|
|
|
|
printf("Unsupported mono file load!\n");
|
|
|
|
|
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);
|
|
|
|
|
j = i - 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
initVar1 = initVar1Save;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saveVar6[0] = 0;
|
|
|
|
|
|
|
|
|
|
currentcellHead = cellHead.next;
|
|
|
|
|
|
|
|
|
|
while (currentcellHead) {
|
|
|
|
|
if (currentcellHead->type == 5) {
|
|
|
|
|
uint8 *ptr =
|
|
|
|
|
mainProc14(currentcellHead->overlay,
|
|
|
|
|
currentcellHead->idx);
|
|
|
|
|
|
|
|
|
|
ASSERT(0);
|
|
|
|
|
|
|
|
|
|
if (ptr) {
|
|
|
|
|
ASSERT(0);
|
|
|
|
|
//*(int16*)(currentcellHead->datas+0x2E) = getSprite(ptr,*(int16*)(currentcellHead->datas+0xE));
|
|
|
|
|
} else {
|
|
|
|
|
//*(int16*)(currentcellHead->datas+0x2E) = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentcellHead = currentcellHead->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: here, restart music
|
|
|
|
|
|
|
|
|
|
if (strlen((char *)currentCtpName)) {
|
|
|
|
|
ctpVar1 = 1;
|
|
|
|
|
loadCtp(currentCtpName);
|
|
|
|
|
ctpVar1 = 0;
|
|
|
|
|
}
|
|
|
|
|
//prepareFadeOut();
|
|
|
|
|
//gfxModuleData.gfxFunction8();
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
|
|
if (strlen((char *)backgroundTable[j].name)) {
|
|
|
|
|
loadBackground(backgroundTable[j].name, j);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
regenerateBackgroundIncrust(&backgroundIncrustHead);
|
|
|
|
|
|
|
|
|
|
// to finish
|
|
|
|
|
|
|
|
|
|
changeCursor(0);
|
|
|
|
|
mainDraw(1);
|
|
|
|
|
flipScreen();
|
|
|
|
|
|
|
|
|
|
return (0);
|
2007-04-27 12:58:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // End of namespace Cruise
|