aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/saveload.cpp
diff options
context:
space:
mode:
authorVincent Hamm2007-04-27 20:31:43 +0000
committerVincent Hamm2007-04-27 20:31:43 +0000
commit0d07a51acf775b638b1112e707cc615041a2e938 (patch)
tree2da102abe89fa59d1569e93dac7faa11f98a0afd /engines/cruise/saveload.cpp
parentfbc2f89b08db6c336741b984fd4b9708fcd15c3e (diff)
downloadscummvm-rg350-0d07a51acf775b638b1112e707cc615041a2e938.tar.gz
scummvm-rg350-0d07a51acf775b638b1112e707cc615041a2e938.tar.bz2
scummvm-rg350-0d07a51acf775b638b1112e707cc615041a2e938.zip
Cleanup
svn-id: r26624
Diffstat (limited to 'engines/cruise/saveload.cpp')
-rw-r--r--engines/cruise/saveload.cpp443
1 files changed, 443 insertions, 0 deletions
diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp
new file mode 100644
index 0000000000..fc5c07bca4
--- /dev/null
+++ b/engines/cruise/saveload.cpp
@@ -0,0 +1,443 @@
+/* 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é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(&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;
+
+ 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