diff options
author | Ludvig Strigeus | 2001-10-16 10:01:48 +0000 |
---|---|---|
committer | Ludvig Strigeus | 2001-10-16 10:01:48 +0000 |
commit | 794163c1a334e9f99f7cdd70ab2c70fd7bd04737 (patch) | |
tree | b40304976533e40b7f557018d95c844a15612c63 /saveload.cpp | |
parent | 862192dbebd24f32e24f051b5a88f1bb6d801be8 (diff) | |
download | scummvm-rg350-794163c1a334e9f99f7cdd70ab2c70fd7bd04737.tar.gz scummvm-rg350-794163c1a334e9f99f7cdd70ab2c70fd7bd04737.tar.bz2 scummvm-rg350-794163c1a334e9f99f7cdd70ab2c70fd7bd04737.zip |
preliminary DOTT support
svn-id: r3433
Diffstat (limited to 'saveload.cpp')
-rw-r--r-- | saveload.cpp | 257 |
1 files changed, 149 insertions, 108 deletions
diff --git a/saveload.cpp b/saveload.cpp index d9f530b1ac..37c7801dba 100644 --- a/saveload.cpp +++ b/saveload.cpp @@ -17,6 +17,9 @@ * * Change Log: * $Log$ + * Revision 1.3 2001/10/16 10:01:47 strigeus + * preliminary DOTT support + * * Revision 1.2 2001/10/10 10:02:33 strigeus * alternative mouse cursor * basic save&load @@ -31,10 +34,25 @@ #include "stdafx.h" #include "scumm.h" +struct SaveGameHeader { + uint32 type; + uint32 size; + uint32 ver; +}; + bool Scumm::saveState(const char *filename) { FILE *out = fopen(filename,"wb"); + SaveGameHeader hdr; + if (out==NULL) return false; + + hdr.type = MKID('SCVM'); + hdr.size = 0; + hdr.ver = 1; + + fwrite(&hdr, sizeof(hdr), 1, out); + saveOrLoad(out,true); fclose(out); debug(1,"State saved as '%s'", filename); @@ -44,11 +62,25 @@ bool Scumm::saveState(const char *filename) { bool Scumm::loadState(const char *filename) { FILE *out = fopen(filename,"rb"); int i,j; + SaveGameHeader hdr; if (out==NULL) return false; + + fread(&hdr, sizeof(hdr), 1, out); + if (hdr.type != MKID('SCVM')) { + warning("Invalid savegame '%s'", filename); + fclose(out); + return false; + } + + if (hdr.ver != 1) { + warning("Invalid version of '%s'", filename); + fclose(out); + return false; + } - checkHeap(); + CHECK_HEAP openRoom(-1); memset(_inventory, 0, sizeof(_inventory)); @@ -74,7 +106,7 @@ bool Scumm::loadState(const char *filename) { initBGBuffers(); - checkHeap(); + CHECK_HEAP debug(1,"State loaded from '%s'", filename); @@ -95,10 +127,10 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(ObjectData,cdhd_10,sleUint16), MKLINE(ObjectData,cdhd_12,sleUint16), MKLINE(ObjectData,obj_nr,sleUint16), - MKLINE(ObjectData,x_pos,sleByte), - MKLINE(ObjectData,y_pos,sleByte), - MKLINE(ObjectData,numstrips,sleByte), - MKLINE(ObjectData,height,sleByte), + MKLINE(ObjectData,x_pos,sleInt16), + MKLINE(ObjectData,y_pos,sleInt16), + MKLINE(ObjectData,numstrips,sleUint16), + MKLINE(ObjectData,height,sleUint16), MKLINE(ObjectData,actordir,sleByte), MKLINE(ObjectData,parentstate,sleByte), MKLINE(ObjectData,parent,sleByte), @@ -116,13 +148,13 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Actor,elevation,sleInt16), MKLINE(Actor,width,sleUint16), MKLINE(Actor,facing,sleByte), - MKLINE(Actor,costume,sleByte), + MKLINE(Actor,costume,sleUint16), MKLINE(Actor,room,sleByte), MKLINE(Actor,talkColor,sleByte), MKLINE(Actor,scalex,sleByte), MKLINE(Actor,scaley,sleByte), MKLINE(Actor,charset,sleByte), - MKLINE(Actor,sound,sleByte), + MKARRAY(Actor,sound[0],sleByte, 8), MKLINE(Actor,newDirection,sleByte), MKLINE(Actor,moving,sleByte), MKLINE(Actor,ignoreBoxes,sleByte), @@ -147,6 +179,10 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Actor,needBgReset,sleByte), MKLINE(Actor,costumeNeedsInit,sleByte), + MKLINE(Actor,new_1,sleInt16), + MKLINE(Actor,new_2,sleInt16), + MKLINE(Actor,new_3,sleByte), + MKLINE(Actor,walkdata.destx,sleInt16), MKLINE(Actor,walkdata.desty,sleInt16), MKLINE(Actor,walkdata.destbox,sleByte), @@ -203,14 +239,14 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Scumm,_IM00_offs,sleUint32), MKLINE(Scumm,_CLUT_offs,sleUint32), MKLINE(Scumm,_EPAL_offs,sleUint32), + MKLINE(Scumm,_PALS_offs,sleUint32), + MKLINE(Scumm,_curPalIndex,sleByte), MKLINE(Scumm,_currentRoom,sleByte), MKLINE(Scumm,_roomResource,sleByte), MKLINE(Scumm,_numObjectsInRoom,sleByte), MKLINE(Scumm,_currentScript,sleByte), MKARRAY(Scumm,_localScriptList[0],sleUint32,0x39), - MKARRAY(Scumm,vm.vars[0],sleUint16,801), MKARRAY(Scumm,vm.localvar[0],sleUint16,20*17), - MKARRAY(Scumm,vm.bitvars[0],sleByte,256), MKARRAY(Scumm,_resourceMapper[0],sleByte,128), MKARRAY(Scumm,charset._colorMap[0],sleByte,16), MKARRAY(Scumm,_charsetData[0][0],sleByte,10*16), @@ -238,12 +274,6 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Scumm,_numInMsgStack,sleInt16), MKLINE(Scumm,_sentenceIndex,sleByte), - MKARRAY(Scumm,_sentenceTab[0],sleByte,6), - MKARRAY(Scumm,_sentenceTab2[0],sleByte,6), - MKARRAY(Scumm,_sentenceTab3[0],sleUint16,6), - MKARRAY(Scumm,_sentenceTab4[0],sleUint16,6), - MKARRAY(Scumm,_sentenceTab5[0],sleByte,6), - MKLINE(Scumm,vm.cutSceneStackPointer,sleByte), MKARRAY(Scumm,vm.cutScenePtr[0],sleUint32,5), MKARRAY(Scumm,vm.cutSceneScript[0],sleByte,5), @@ -256,7 +286,6 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Scumm,_cursorState,sleByte), MKLINE(Scumm,gdi.unk4,sleByte), MKLINE(Scumm,gdi.currentCursor,sleByte), -// MKLINE(Scumm,gdi.unk3,sleByte), MKLINE(Scumm,dseg_4F8A,sleUint16), MKLINE(Scumm,_switchRoomEffect,sleByte), @@ -264,37 +293,13 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(Scumm,_switchRoomEffect2,sleByte), MKLINE(Scumm,_BgNeedsRedraw,sleByte), - MKARRAY(Scumm,actorDrawBits[0],sleUint16,160), + MKARRAY(Scumm,actorDrawBits[0],sleUint16,200), MKLINE(Scumm,gdi.transparency,sleByte), MKARRAY(Scumm,_currentPalette[0],sleByte,768), - /* virtscr */ MKARRAY(Scumm,charset._buffer[0],sleByte,256), - MKARRAY(Scumm,textslot.x[0],sleInt16,6), - MKARRAY(Scumm,textslot.y[0],sleInt16,6), - MKARRAY(Scumm,textslot.center[0],sleInt16,6), - MKARRAY(Scumm,textslot.overhead[0],sleInt16,6), - MKARRAY(Scumm,textslot.right[0],sleInt16,6), - MKARRAY(Scumm,textslot.color[0],sleInt16,6), - MKARRAY(Scumm,textslot.charset[0],sleInt16,6), - - MKARRAY(Scumm,_stringXpos[0],sleInt16,6), - MKARRAY(Scumm,_stringYpos[0],sleInt16,6), - MKARRAY(Scumm,_stringXpos2[0],sleInt16,6), - MKARRAY(Scumm,_stringYpos2[0],sleInt16,6), - MKARRAY(Scumm,_stringCenter[0],sleInt16,6), - MKARRAY(Scumm,_stringOverhead[0],sleUint16,6), - MKARRAY(Scumm,_stringRight[0],sleUint16,6), - MKARRAY(Scumm,_stringColor[0],sleUint16,6), - MKARRAY(Scumm,_stringCharset[0],sleUint16,6), - - MKLINE(Scumm,charset._mask_left,sleInt16), - MKLINE(Scumm,charset._mask_top,sleInt16), - MKLINE(Scumm,charset._mask_right,sleInt16), - MKLINE(Scumm,charset._mask_bottom,sleInt16), - MKLINE(Scumm,dseg_3A76,sleUint16), MKARRAY(Scumm,_imgBufOffs[0],sleUint16,4), @@ -327,6 +332,7 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKLINE(ScriptSlot,offs,sleUint32), MKLINE(ScriptSlot,delay,sleInt32), MKLINE(ScriptSlot,number,sleUint16), + MKLINE(ScriptSlot,newfield,sleUint16), MKLINE(ScriptSlot,status,sleByte), MKLINE(ScriptSlot,type,sleByte), MKLINE(ScriptSlot,unk1,sleByte), @@ -345,6 +351,39 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { MKEND() }; + const SaveLoadEntry sentenceTabEntries[] = { + MKLINE(SentenceTab,unk5,sleUint8), + MKLINE(SentenceTab,unk2,sleUint8), + MKLINE(SentenceTab,unk4,sleUint16), + MKLINE(SentenceTab,unk3,sleUint16), + MKLINE(SentenceTab,unk,sleUint8), + MKEND() + }; + + const SaveLoadEntry stringTabEntries[] = { + MKLINE(StringTab,t_xpos,sleInt16), + MKLINE(StringTab,t_ypos,sleInt16), + MKLINE(StringTab,t_center,sleInt16), + MKLINE(StringTab,t_overhead,sleInt16), + MKLINE(StringTab,t_new3,sleInt16), + MKLINE(StringTab,t_right,sleInt16), + MKLINE(StringTab,t_color,sleInt16), + MKLINE(StringTab,t_charset,sleInt16), + MKLINE(StringTab,xpos,sleInt16), + MKLINE(StringTab,ypos,sleInt16), + MKLINE(StringTab,xpos2,sleInt16), + MKLINE(StringTab,ypos2,sleInt16), + MKLINE(StringTab,center,sleInt16), + MKLINE(StringTab,overhead,sleInt16), + MKLINE(StringTab,new_3,sleInt16), + MKLINE(StringTab,right,sleInt16), + MKLINE(StringTab,mask_top,sleInt16), + MKLINE(StringTab,mask_bottom,sleInt16), + MKLINE(StringTab,mask_right,sleInt16), + MKLINE(StringTab,mask_left,sleInt16), + MKEND() + }; + int i,j; _saveLoadStream = inout; @@ -355,29 +394,26 @@ void Scumm::saveOrLoad(FILE *inout, bool mode) { saveLoadEntries(&actor[i],actorEntries); for (i=0; i<20; i++) saveLoadEntries(&vm.slot[i],scriptSlotEntries); - for (i=0; i<184; i++) - saveLoadEntries(&objs[i],objectEntries); - for (i=0; i<102; i++) - saveLoadEntries(&verbs[i],verbEntries); + for (i=0; i<_numLocalObjects; i++) + saveLoadEntries(&_objs[i],objectEntries); + for (i=0; i<_numVerbs; i++) + saveLoadEntries(&_verbs[i],verbEntries); for (i=0; i<16; i++) saveLoadEntries(&vm.nest[i],nestedScriptEntries); + for (i=0; i<6; i++) + saveLoadEntries(&sentence[i],sentenceTabEntries); + for (i=0; i<6; i++) + saveLoadEntries(&string[i],stringTabEntries); for (i=1; i<16; i++) if (res.mode[i]==0) for(j=1; j<res.num[i]; j++) saveLoadResource(i,j); - if (_saveOrLoad) { - for (i=0; i<_maxNrObjects; i++) { - saveByte(_objectFlagTable[i]); - saveUint32(_classData[i]); - } - } else { - for (i=0; i<_maxNrObjects; i++) { - _objectFlagTable[i] = loadByte(); - _classData[i] = loadUint32(); - } - } + saveLoadArrayOf(_objectFlagTable, _numGlobalObjects, sizeof(_objectFlagTable[0]), sleByte); + saveLoadArrayOf(_classData, _numGlobalObjects, sizeof(_classData[0]), sleUint32); + saveLoadArrayOf(_vars, _numVariables, sizeof(_vars[0]), sleInt16); + saveLoadArrayOf(_bitVars, _numBitVariables>>8, 1, sleByte); } void Scumm::saveLoadResource(int type, int index) { @@ -454,6 +490,61 @@ byte Scumm::loadByte() { return e; } +void Scumm::saveLoadArrayOf(void *b, int len, int datasize, byte filetype) { + byte *at = (byte*)b; + uint32 data; + + while (--len>=0) { + if (_saveOrLoad) { + /* saving */ + if (datasize==1) { + data = *(byte*)at; + at += 1; + } else if (datasize==2) { + data = *(uint16*)at; + at += 2; + } else if (datasize==4) { + data = *(uint32*)at; + at += 4; + } else { + error("saveLoadArrayOf: invalid size %d", datasize); + } + switch(filetype) { + case sleByte: saveByte(data); break; + case sleUint16: + case sleInt16:saveWord(data); break; + case sleInt32: + case sleUint32:saveUint32(data); break; + default: + error("saveLoadArrayOf: invalid filetype %d", filetype); + } + } else { + /* loading */ + switch(filetype) { + case sleByte: data = loadByte(); break; + case sleUint16: data = loadWord(); break; + case sleInt16: data = (int16)loadWord(); break; + case sleUint32: data = loadUint32(); break; + case sleInt32: data = (int32)loadUint32(); break; + default: + error("saveLoadArrayOf: invalid filetype %d", filetype); + } + if (datasize==1) { + *(byte*)at = data; + at += 1; + } else if (datasize==2) { + *(uint16*)at = data; + at += 2; + } else if (datasize==4) { + *(uint32*)at = data; + at += 4; + } else { + error("saveLoadArrayOf: invalid size %d", datasize); + } + } + } +} + void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) { int replen; @@ -461,7 +552,6 @@ void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) { byte *at; int size; int value; - uint32 data; while(sle->offs != 0xFFFF) { at = (byte*)d + sle->offs; @@ -474,56 +564,7 @@ void Scumm::saveLoadEntries(void *d, const SaveLoadEntry *sle) { type&=~128; } sle++; - - do { - if (_saveOrLoad) { - /* saving */ - if (size==1) { - data = *(byte*)at; - at += 1; - } else if (size==2) { - data = *(uint16*)at; - at += 2; - } else if (size==4) { - data = *(uint32*)at; - at += 4; - } else { - warning("invalid size %d", size); - } - switch(type) { - case sleByte: saveByte(data); break; - case sleUint16: - case sleInt16:saveWord(data); break; - case sleInt32: - case sleUint32:saveUint32(data); break; - default: - warning("invalid type %d", type); - } - } else { - /* loading */ - switch(type) { - case sleByte: data = loadByte(); break; - case sleUint16: data = loadWord(); break; - case sleInt16: data = (int16)loadWord(); break; - case sleUint32: data = loadUint32(); break; - case sleInt32: data = (int32)loadUint32(); break; - default: - warning("invalid type %d", type); - } - if (size==1) { - *(byte*)at = data; - at += 1; - } else if (size==2) { - *(uint16*)at = data; - at += 2; - } else if (size==4) { - *(uint32*)at = data; - at += 4; - } else { - warning("invalid size %d", size); - } - } - } while (--replen); + saveLoadArrayOf(at, replen, size, type); } } |