diff options
author | Vincent Hamm | 2007-04-27 20:31:43 +0000 |
---|---|---|
committer | Vincent Hamm | 2007-04-27 20:31:43 +0000 |
commit | 0d07a51acf775b638b1112e707cc615041a2e938 (patch) | |
tree | 2da102abe89fa59d1569e93dac7faa11f98a0afd /engines/cruise/saveload.cpp | |
parent | fbc2f89b08db6c336741b984fd4b9708fcd15c3e (diff) | |
download | scummvm-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.cpp | 443 |
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(¤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 |