mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-20 00:41:12 +00:00
0d07a51acf
svn-id: r26624
444 lines
9.9 KiB
C++
444 lines
9.9 KiB
C++
/* 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);
|
||
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;
|
||
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);
|
||
animationStart = bTemp;
|
||
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);
|
||
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;
|
||
|
||
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);
|
||
}
|
||
|
||
} // End of namespace Cruise
|