[Scummvm-cvs-logs] SF.net SVN: scummvm:[47696] scummvm/trunk/engines/sci/engine

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Sat Jan 30 03:04:00 CET 2010


Revision: 47696
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47696&view=rev
Author:   mthreepwood
Date:     2010-01-30 02:03:59 +0000 (Sat, 30 Jan 2010)

Log Message:
-----------
Add support for saving/loading Arrays/Strings in SCI32. It's possible to save a game in GK1 now via the console, but not load (yet).

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kfile.cpp
    scummvm/trunk/engines/sci/engine/savegame.cpp
    scummvm/trunk/engines/sci/engine/savegame.h
    scummvm/trunk/engines/sci/engine/segment.h

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2010-01-30 01:46:54 UTC (rev 47695)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2010-01-30 02:03:59 UTC (rev 47696)
@@ -284,7 +284,7 @@
 	/*60*/	DEFUN("SetMenu", kSetMenu, "i.*"),
 	/*61*/	DEFUN("GetSaveFiles", kGetSaveFiles, "rrr"),
 	/*62*/	DEFUN("GetCWD", kGetCWD, "r"),
-	/*63*/	DEFUN("CheckFreeSpace", kCheckFreeSpace, "r"),
+	/*63*/	DEFUN("CheckFreeSpace", kCheckFreeSpace, "r.*"),
 	/*64*/	DEFUN("ValidPath", kValidPath, "r"),
 	/*65*/	DEFUN("CoordPri", kCoordPri, "ii*"),
 	/*66*/	DEFUN("StrAt", kStrAt, "rii*"),

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2010-01-30 01:46:54 UTC (rev 47695)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2010-01-30 02:03:59 UTC (rev 47696)
@@ -425,6 +425,12 @@
 }
 
 reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) {
+#ifdef ENABLE_SCI32
+	// TODO: SCI32 uses a parameter here.
+	if (argc > 1)
+		warning("kCheckFreeSpace called with %d parameter(s): %04x:%04x", argc, PRINT_REG(argv[1]));
+#endif
+
 	Common::String path = s->_segMan->getString(argv[0]);
 
 	debug(3, "kCheckFreeSpace(%s)", path.c_str());

Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp	2010-01-30 01:46:54 UTC (rev 47695)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp	2010-01-30 02:03:59 UTC (rev 47696)
@@ -46,6 +46,10 @@
 #include "sci/sound/music.h"
 #endif
 
+#ifdef ENABLE_SCI32
+#include "sci/graphics/gui32.h"
+#endif
+
 namespace Sci {
 
 
@@ -356,10 +360,11 @@
 	s.skip(4, VER(12), VER(12));	// obsolete: used to be status_bar_foreground
 	s.skip(4, VER(12), VER(12));	// obsolete: used to be status_bar_background
 
-	if (s.getVersion() >= 13) {
+	if (s.getVersion() >= 13 && _gui) {
 		// Save/Load picPort as well (cause sierra sci also does this)
 		int16 picPortTop, picPortLeft;
 		Common::Rect picPortRect;
+
 		if (s.isSaving())
 			picPortRect = _gui->getPortPic(picPortTop, picPortLeft);
 
@@ -422,6 +427,72 @@
 	sync_reg_t(s, obj.value);
 }
 
+#ifdef ENABLE_SCI32
+template <>
+void syncWithSerializer(Common::Serializer &s, Table<SciArray<reg_t> >::Entry &obj) {
+	s.syncAsSint32LE(obj.next_free);
+
+	byte type = 0;
+	uint32 size = 0;
+	
+	if (s.isSaving()) {
+		type = (byte)obj.getType();
+		size = obj.getSize();
+		s.syncAsByte(type);
+		s.syncAsUint32LE(size);
+	} else {
+		s.syncAsByte(type);
+		s.syncAsUint32LE(size);
+		obj.setType((int8)type);
+
+		// HACK: Skip arrays that have a negative type
+		if ((int8)type < 0)
+			return;
+
+		obj.setSize(size);
+	}
+
+	for (uint32 i = 0; i < size; i++) {
+		reg_t value;
+		
+		if (s.isSaving())
+			value = obj.getValue(i);
+
+		sync_reg_t(s, value);
+
+		if (s.isLoading())
+			obj.setValue(i, value);
+	}
+}
+
+template <>
+void syncWithSerializer(Common::Serializer &s, Table<SciString>::Entry &obj) {
+	s.syncAsSint32LE(obj.next_free);
+
+	uint32 size = 0;
+	
+	if (s.isSaving()) {
+		size = obj.getSize();
+		s.syncAsUint32LE(size);
+	} else {
+		s.syncAsUint32LE(size);
+		obj.setSize(size);
+	}
+
+	for (uint32 i = 0; i < size; i++) {
+		char value;
+		
+		if (s.isSaving())
+			value = obj.getValue(i);
+
+		s.syncAsByte(value);
+
+		if (s.isLoading())
+			obj.setValue(i, value);
+	}
+}
+#endif
+
 template <typename T>
 void sync_Table(Common::Serializer &s, T &obj) {
 	s.syncAsSint32LE(obj.first_free);
@@ -616,6 +687,22 @@
 }
 #endif
 
+#ifdef ENABLE_SCI32
+void ArrayTable::saveLoadWithSerializer(Common::Serializer &ser) {
+	if (ser.getVersion() < 18)
+		return;
+
+	sync_Table<ArrayTable>(ser, *this);
+}
+
+void StringTable::saveLoadWithSerializer(Common::Serializer &ser) {
+	if (ser.getVersion() < 18)
+		return;
+
+	sync_Table<StringTable>(ser, *this);
+}
+#endif
+
 #pragma mark -
 
 
@@ -861,6 +948,12 @@
 	// Create a new EngineState object
 	retval = new EngineState(s->resMan, s->_kernel, s->_voc, s->_segMan, s->_gui, s->_audio);
 	retval->_event = new SciEvent();
+	
+#ifdef ENABLE_SCI32
+	// Copy the Gui32 pointer over to the new EngineState, if it exists
+	if (s->_gui32)
+		retval->_gui32 = s->_gui32;
+#endif
 
 	// Copy some old data
 	retval->_soundCmd = s->_soundCmd;
@@ -923,8 +1016,17 @@
 	// Message state:
 	retval->_msgState = new MessageState(retval->_segMan);
 
-	retval->_gui->resetEngineState(retval);
-	retval->_gui->init(retval->usesOldGfxFunctions());
+#ifdef ENABLE_SCI32
+	if (retval->_gui32) {
+		retval->_gui32->resetEngineState(retval);
+		retval->_gui32->init();
+	} else {
+#endif
+		retval->_gui->resetEngineState(retval);
+		retval->_gui->init(retval->usesOldGfxFunctions());
+#ifdef ENABLE_SCI32
+	}
+#endif
 
 	return retval;
 }

Modified: scummvm/trunk/engines/sci/engine/savegame.h
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.h	2010-01-30 01:46:54 UTC (rev 47695)
+++ scummvm/trunk/engines/sci/engine/savegame.h	2010-01-30 02:03:59 UTC (rev 47696)
@@ -36,7 +36,7 @@
 struct EngineState;
 
 enum {
-	CURRENT_SAVEGAME_VERSION = 17,
+	CURRENT_SAVEGAME_VERSION = 18,
 	MINIMUM_SAVEGAME_VERSION = 9
 };
 

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2010-01-30 01:46:54 UTC (rev 47695)
+++ scummvm/trunk/engines/sci/engine/segment.h	2010-01-30 02:03:59 UTC (rev 47696)
@@ -801,14 +801,14 @@
 struct ArrayTable : public Table<SciArray<reg_t> > {
 	ArrayTable() : Table<SciArray<reg_t> >(SEG_TYPE_ARRAY) {}
 
-	virtual void saveLoadWithSerializer(Common::Serializer &ser) {}
+	void saveLoadWithSerializer(Common::Serializer &ser);
 	SegmentRef dereference(reg_t pointer);
 };
 
 struct StringTable : public Table<SciString> {
 	StringTable() : Table<SciString>(SEG_TYPE_STRING) {}
 
-	virtual void saveLoadWithSerializer(Common::Serializer &ser) {}
+	void saveLoadWithSerializer(Common::Serializer &ser);
 	SegmentRef dereference(reg_t pointer);
 };
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list