scummvm/engines/cruise/saveload.cpp

444 lines
9.9 KiB
C++
Raw Normal View History

/* ScummVM - Scumm Interpreter
* Copyright (C) 2006 The ScummVM project
*
* cinE Engine is (C) 2004-2005 by CinE Team
*
* 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 {
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);
}
}
}
}
}
void loadScriptsFromSave(FILE* fileHandle,scriptInstanceStruct* entry)
{
short int numScripts;
int i;
fread(&numScripts,2,1,fileHandle);
for(i=0;i<numScripts;i++)
{
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
fread(&ptr->varA,2,1,fileHandle);
if(ptr->varA)
{
ptr->var6 = (uint8*)mallocAndZero(ptr->varA);
fread(ptr->var6,ptr->varA,1,fileHandle);
}
/////////
ptr->bitMask = *((int16*)ptr+1);
/////////
ptr->nextScriptPtr = 0;
entry->nextScriptPtr = ptr;
entry = ptr;
}
}
void loadSavegameActor(FILE* fileHandle)
{
short int numEntry;
actorStruct* ptr;
int i;
fread(&numEntry,2,1,fileHandle);
ptr = &actorHead;
for(i=0;i<numEntry;i++)
{
actorStruct* current = (actorStruct*)mallocAndZero(sizeof(actorStruct));
fseek(fileHandle, 4, SEEK_CUR);
2007-04-27 20:31:43 +00:00
fread(current,0x26,1,fileHandle);
current->next = NULL;
ptr->next = current;
current->prev = actorHead.prev;
actorHead.prev = current;
ptr = current->next;
}
}
void loadSavegameDataSub5(FILE* fileHandle)
{
if(var1)
{
fread(&saveVar1,1,1,fileHandle);
if(saveVar1)
{
fread(saveVar2,saveVar1,1,fileHandle);
}
}
else
{
fread(&saveVar1,1,1,fileHandle);
}
}
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);
}
}
}
}
int loadSavegameData(int saveGameIdx)
{
char buffer[256];
FILE* fileHandle;
char saveIdentBuffer[6];
int j;
int initVar1Save;
2007-04-27 20:31:43 +00:00
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);
2007-04-27 20:31:43 +00:00
int16 bTemp;
fread(&bTemp,2,1,fileHandle);
animationStart = bTemp;
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(&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);
loadScriptsFromSave(fileHandle,&scriptHandle2);
loadScriptsFromSave(fileHandle,&scriptHandle1);
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;
2007-04-27 20:31:43 +00:00
currentcellHead = cellHead.next;
2007-04-27 20:31:43 +00:00
while(currentcellHead)
{
2007-04-27 20:31:43 +00:00
if(currentcellHead->type == 5)
{
2007-04-27 20:31:43 +00:00
uint8* ptr = mainProc14(currentcellHead->overlay,currentcellHead->idx);
ASSERT(0);
if(ptr)
{
ASSERT(0);
2007-04-27 20:31:43 +00:00
//*(int16*)(currentcellHead->datas+0x2E) = getSprite(ptr,*(int16*)(currentcellHead->datas+0xE));
}
else
{
2007-04-27 20:31:43 +00:00
//*(int16*)(currentcellHead->datas+0x2E) = 0;
}
}
2007-04-27 20:31:43 +00:00
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);
}
} // End of namespace Cruise