diff options
| -rw-r--r-- | engines/sci/engine/savegame.cpp | 121 | ||||
| -rw-r--r-- | engines/sci/engine/seg_manager.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/engine/vm.h | 29 | ||||
| -rw-r--r-- | engines/sci/engine/vm_types.h | 3 | 
4 files changed, 75 insertions, 80 deletions
| diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 0dbea5229d..0e9fa28457 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -271,9 +271,9 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) {  	sync_sfx_state_t(s, sound);  } -static void sync_LocalVariables(Common::Serializer &s, LocalVariables &obj) { -	s.syncAsSint32LE(obj.script_id); -	syncArray<reg_t>(s, obj._locals); +void LocalVariables::saveLoadWithSerializer(Common::Serializer &s) { +	s.syncAsSint32LE(script_id); +	syncArray<reg_t>(s, _locals);  }  template <> @@ -319,30 +319,48 @@ void sync_Table(Common::Serializer &s, T &obj) {  	syncArray<typename T::Entry>(s, obj._table);  } -static void sync_Script(Common::Serializer &s, Script &obj) { -	s.syncAsSint32LE(obj.nr); -	s.syncAsUint32LE(obj.buf_size); -	s.syncAsUint32LE(obj.script_size); -	s.syncAsUint32LE(obj.heap_size); +void CloneTable::saveLoadWithSerializer(Common::Serializer &s) { +	sync_Table<CloneTable>(s, *this); +} + +void NodeTable::saveLoadWithSerializer(Common::Serializer &s) { +	sync_Table<NodeTable>(s, *this); +} + +void ListTable::saveLoadWithSerializer(Common::Serializer &s) { +	sync_Table<ListTable>(s, *this); +} + +void HunkTable::saveLoadWithSerializer(Common::Serializer &s) { +	if (s.isLoading()) { +		initTable(); +	} +} + +void Script::saveLoadWithSerializer(Common::Serializer &s) { +	s.syncAsSint32LE(nr); +	s.syncAsUint32LE(buf_size); +	s.syncAsUint32LE(script_size); +	s.syncAsUint32LE(heap_size);  	// FIXME: revamp obj_indices handling -	if (!obj.obj_indices) { +	if (!obj_indices) {  		assert(s.isLoading()); -		obj.obj_indices = new IntMapper(); +		obj_indices = new IntMapper();  	} -	obj.obj_indices->saveLoadWithSerializer(s); +	obj_indices->saveLoadWithSerializer(s); -	s.syncAsSint32LE(obj.exports_nr); -	s.syncAsSint32LE(obj.synonyms_nr); -	s.syncAsSint32LE(obj.lockers); +	s.syncAsSint32LE(exports_nr); +	s.syncAsSint32LE(synonyms_nr); +	s.syncAsSint32LE(lockers); -	syncArray<Object>(s, obj._objects); +	syncArray<Object>(s, _objects); -	s.syncAsSint32LE(obj.locals_offset); -	s.syncAsSint32LE(obj.locals_segment); +	s.syncAsSint32LE(locals_offset); +	s.syncAsSint32LE(locals_segment); -	s.syncAsSint32LE(obj._markedAsDeleted); +	s.syncAsSint32LE(_markedAsDeleted);  }  static void sync_SystemString(Common::Serializer &s, SystemString &obj) { @@ -354,29 +372,33 @@ static void sync_SystemString(Common::Serializer &s, SystemString &obj) {  	syncCStr(s, (char **)&obj.value);  } -static void sync_SystemStrings(Common::Serializer &s, SystemStrings &obj) { +void SystemStrings::saveLoadWithSerializer(Common::Serializer &s) {  	for (int i = 0; i < SYS_STRINGS_MAX; ++i) -		sync_SystemString(s, obj.strings[i]); +		sync_SystemString(s, strings[i]);  } -static void sync_DynMem(Common::Serializer &s, DynMem &obj) { -	s.syncAsSint32LE(obj._size); -	syncCStr(s, &obj._description); -	if (!obj._buf && obj._size) { -		obj._buf = (byte *)calloc(obj._size, 1); +void DynMem::saveLoadWithSerializer(Common::Serializer &s) { +	s.syncAsSint32LE(_size); +	syncCStr(s, &_description); +	if (!_buf && _size) { +		_buf = (byte *)calloc(_size, 1);  	} -	if (obj._size) -		s.syncBytes(obj._buf, obj._size); +	if (_size) +		s.syncBytes(_buf, _size);  } -static void sync_DataStack(Common::Serializer &s, DataStack &obj) { -	s.syncAsUint32LE(obj.nr); +void DataStack::saveLoadWithSerializer(Common::Serializer &s) { +	s.syncAsUint32LE(nr);  	if (s.isLoading()) { -		//free(obj.entries); -		obj.entries = (reg_t *)calloc(obj.nr, sizeof(reg_t)); +		//free(entries); +		entries = (reg_t *)calloc(nr, sizeof(reg_t));  	}  } +void StringFrag::saveLoadWithSerializer(Common::Serializer &s) { +	// TODO +} +  #pragma mark -  static void sync_songlib_t(Common::Serializer &s, songlib_t &obj) { @@ -422,42 +444,7 @@ static void sync_MemObjPtr(Common::Serializer &s, MemObject *&mobj) {  	}  	s.syncAsSint32LE(mobj->_segmgrId); -	switch (type) { -	case MEM_OBJ_SCRIPT: -		sync_Script(s, *(Script *)mobj); -		break; -	case MEM_OBJ_CLONES: -		sync_Table<CloneTable>(s, *(CloneTable *)mobj); -		break; -	case MEM_OBJ_LOCALS: -		sync_LocalVariables(s, *(LocalVariables *)mobj); -		break; -	case MEM_OBJ_SYS_STRINGS: -		sync_SystemStrings(s, *(SystemStrings *)mobj); -		break; -	case MEM_OBJ_STACK: -		sync_DataStack(s, *(DataStack *)mobj); -		break; -	case MEM_OBJ_HUNK: -		if (s.isLoading()) { -			(*(HunkTable *)mobj).initTable(); -		} -		break; -	case MEM_OBJ_STRING_FRAG: -		break; -	case MEM_OBJ_LISTS: -		sync_Table<ListTable>(s, *(ListTable *)mobj); -		break; -	case MEM_OBJ_NODES: -		sync_Table<NodeTable>(s, *(NodeTable *)mobj); -		break; -	case MEM_OBJ_DYNMEM: -		sync_DynMem(s, *(DynMem *)mobj); -		break; -	default: -		error("Unknown MemObject type %d", type); -		break; -	} +	mobj->saveLoadWithSerializer(s);  } diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index f55cad20c1..a4e9bba27f 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -254,7 +254,7 @@ MemObject *MemObject::createMemObject(MemObjectType type) {  		mem = new HunkTable();  		break;  	case MEM_OBJ_STRING_FRAG: -		mem = new MemObject();	// FIXME: This is a temporary hack until MEM_OBJ_STRING_FRAG is implemented +		mem = new StringFrag();  		break;  	case MEM_OBJ_LISTS:  		mem = new ListTable(); diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index a6e232472e..c187179bb8 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -28,7 +28,7 @@  /* VM and kernel declarations */ -//#include "common/serializer.h" +#include "common/serializer.h"  #include "sci/engine/vm_types.h"	// for reg_t  #include "common/util.h" @@ -55,7 +55,7 @@ enum MemObjectType {  	MEM_OBJ_MAX // For sanity checking  }; -struct MemObject /* : public Common::Serializable */ { +struct MemObject : public Common::Serializable {  	MemObjectType _type;  	int _segmgrId; /**< Internal value used by the seg_manager's hash map */ @@ -103,6 +103,11 @@ public:  }; +// TODO: Implement the following class +struct StringFrag : public MemObject { +	virtual void saveLoadWithSerializer(Common::Serializer &ser); +}; +  struct IntMapper;  enum { @@ -144,7 +149,7 @@ public:  	virtual byte *dereference(reg_t pointer, int *size); -//	virtual void saveLoadWithSerializer(Common::Serializer &ser); +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  };  /** Number of bytes to be allocated for the stack */ @@ -255,7 +260,7 @@ public:  	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -//	virtual void saveLoadWithSerializer(Common::Serializer &ser); +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  };  /** Clone has been marked as 'freed' */ @@ -366,7 +371,7 @@ public:  	virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -//	virtual void saveLoadWithSerializer(Common::Serializer &ser); +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  	// script lock operations @@ -479,7 +484,7 @@ public:  	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); -//	virtual void saveLoadWithSerializer(Common::Serializer &ser); +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  };  #define CLONE_USED -1 @@ -560,8 +565,6 @@ public:  	}  	virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); - -//	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; @@ -569,6 +572,8 @@ public:  struct CloneTable : public Table<Clone> {  	virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; @@ -576,6 +581,8 @@ struct CloneTable : public Table<Clone> {  struct NodeTable : public Table<Node> {  	virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; @@ -583,6 +590,8 @@ struct NodeTable : public Table<Node> {  struct ListTable : public Table<List> {  	virtual void freeAtAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllOutgoingReferences(EngineState *s, reg_t object, void *param, NoteCallback note); + +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; @@ -593,6 +602,8 @@ struct HunkTable : public Table<Hunk> {  		free(_table[idx].mem);  	} + +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; @@ -615,7 +626,7 @@ public:  	virtual reg_t findCanonicAddress(SegManager *segmgr, reg_t sub_addr);  	virtual void listAllDeallocatable(SegmentId segId, void *param, NoteCallback note); -//	virtual void saveLoadWithSerializer(Common::Serializer &ser); +	virtual void saveLoadWithSerializer(Common::Serializer &ser);  };  /** Contains selector IDs for a few selected selectors */ diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index 7412532a3b..1dedf9cea5 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -63,9 +63,6 @@ typedef int Selector;  #define PSTK "ST:%04x"  #define PRINT_STK(v) (unsigned) (v - s->stack_base) -// String fragment -typedef reg_t *StringFrag; -  static inline reg_t make_reg(int segment, int offset) {  	reg_t r;  	r.offset = offset; | 
