[Scummvm-cvs-logs] SF.net SVN: scummvm:[42675] scummvm/trunk

Kirben at users.sourceforge.net Kirben at users.sourceforge.net
Thu Jul 23 12:33:13 CEST 2009


Revision: 42675
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42675&view=rev
Author:   Kirben
Date:     2009-07-23 10:33:13 +0000 (Thu, 23 Jul 2009)

Log Message:
-----------
Fix bug #1726909 - HE Games: Glitches after loading saved games, by restircting HE games to their original load/save interface.

Modified Paths:
--------------
    scummvm/trunk/README
    scummvm/trunk/engines/scumm/he/intern_he.h
    scummvm/trunk/engines/scumm/he/script_v100he.cpp
    scummvm/trunk/engines/scumm/he/script_v60he.cpp
    scummvm/trunk/engines/scumm/he/script_v72he.cpp
    scummvm/trunk/engines/scumm/he/script_v80he.cpp
    scummvm/trunk/engines/scumm/he/script_v90he.cpp
    scummvm/trunk/engines/scumm/he/wiz_he.cpp
    scummvm/trunk/engines/scumm/saveload.cpp

Modified: scummvm/trunk/README
===================================================================
--- scummvm/trunk/README	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/README	2009-07-23 10:33:13 UTC (rev 42675)
@@ -772,6 +772,7 @@
     - Amiga versions aren't supported
 
   Humongous Entertainment games:
+    - Only the original load and save interface can be used.
     - No support for printing images
 
 

Modified: scummvm/trunk/engines/scumm/he/intern_he.h
===================================================================
--- scummvm/trunk/engines/scumm/he/intern_he.h	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/intern_he.h	2009-07-23 10:33:13 UTC (rev 42675)
@@ -78,7 +78,7 @@
 	int virtScreenSave(byte *dst, int x1, int y1, int x2, int y2);
 	void virtScreenLoad(int resIdx, int x1, int y1, int x2, int y2);
 
-	int convertFilePath(byte *dst);
+	int convertFilePath(byte *dst, int dstSize);
 	virtual void decodeParseString(int a, int b);
 	void swapObjects(int object1, int object2);
 

Modified: scummvm/trunk/engines/scumm/he/script_v100he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/script_v100he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/script_v100he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -1621,7 +1621,7 @@
 
 		copyScriptString((byte *)buffer, sizeof(buffer));
 
-		r = convertFilePath(buffer);
+		r = convertFilePath(buffer, sizeof(buffer));
 		memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
 		debug(1, "o100_roomOps: case 137: filename %s", _saveLoadFileName);
 
@@ -2239,7 +2239,7 @@
 			if (_videoParams.flags == 0)
 				_videoParams.flags = 4;
 
-			const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename);
+			const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename, sizeof(_videoParams.filename));
 			if (_videoParams.flags == 2) {
 				VAR(119) = _moviePlay->load(filename, _videoParams.flags, _videoParams.wizResNum);
 			} else {

Modified: scummvm/trunk/engines/scumm/he/script_v60he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/script_v60he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/script_v60he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -93,7 +93,7 @@
 	_opcodes[0xed].setProc(0, 0);
 }
 
-int ScummEngine_v60he::convertFilePath(byte *dst) {
+int ScummEngine_v60he::convertFilePath(byte *dst, int dstSize) {
 	debug(1, "convertFilePath: original filePath is %s", dst);
 
 	int len = resStrLen(dst);
@@ -113,16 +113,25 @@
 
 	// Strip path
 	int r = 0;
-	if (dst[0] == '.' && dst[1] == '/') { // Game Data Path
+	if (dst[len - 3] == 's' && dst[len - 2] == 'g') { // Save Game File
+		// Change filename prefix to target name, for save game files.
+		char saveName[20];
+		sprintf(saveName, "%s.sg%c", _targetName.c_str(), dst[len - 1]);
+		memcpy(dst, saveName, 20);
+	} else if (dst[0] == '.' && dst[1] == '/') { // Game Data Path
+		// The default game data path is set to './' by ScummVM
 		r = 2;
 	} else if (dst[0] == '*' && dst[1] == '/') { // Save Game Path (HE72 - HE100)
+		// The default save game path is set to '*/' by ScummVM
 		r = 2;
 	} else if (dst[0] == 'c' && dst[1] == ':') { // Save Game Path (HE60 - HE71)
+		// The default save path is game path (DOS) or 'c:/hegames/' (Windows)
 		for (r = len; r != 0; r--) {
 			if (dst[r - 1] == '/')
 				break;
 		}
 	} else if (dst[0] == 'u' && dst[1] == 's') { // Save Game Path (Moonbase Commander)
+		// The default save path is 'user/'
 		r = 5;
 	}
 
@@ -269,7 +278,7 @@
 		len = resStrLen(_scriptPointer);
 		_scriptPointer += len + 1;
 
-		r = convertFilePath(buffer);
+		r = convertFilePath(buffer, sizeof(buffer));
 		memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
 		debug(1, "o60_roomOps: case 221: filename %s", _saveLoadFileName);
 
@@ -684,7 +693,7 @@
 	len = resStrLen(_scriptPointer);
 	_scriptPointer += len + 1;
 
-	filename = (char *)buffer + convertFilePath(buffer);
+	filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
 	debug(1, "Final filename to %s", filename);
 
 	mode = pop();
@@ -738,7 +747,7 @@
 	len = resStrLen(_scriptPointer);
 	_scriptPointer += len + 1;
 
-	filename = (char *)buffer + convertFilePath(buffer);
+	filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
 
 	debug(1, "o60_deleteFile (\"%s\")", filename);
 
@@ -760,8 +769,8 @@
 	len = resStrLen(_scriptPointer);
 	_scriptPointer += len + 1;
 
-	oldFilename = (char *)buffer1 + convertFilePath(buffer1);
-	newFilename = (char *)buffer2 + convertFilePath(buffer2);
+	oldFilename = (char *)buffer1 + convertFilePath(buffer1, sizeof(buffer1));
+	newFilename = (char *)buffer2 + convertFilePath(buffer2, sizeof(buffer2));
 
 	debug(1, "o60_rename (\"%s\" to \"%s\")", oldFilename, newFilename);
 

Modified: scummvm/trunk/engines/scumm/he/script_v72he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/script_v72he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/script_v72he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -713,7 +713,7 @@
 
 		copyScriptString((byte *)buffer, sizeof(buffer));
 
-		r = convertFilePath(buffer);
+		r = convertFilePath(buffer, sizeof(buffer));
 		memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
 		debug(1, "o72_roomOps: case 221: filename %s", _saveLoadFileName);
 
@@ -1401,7 +1401,7 @@
 		strcpy((char *)buffer, "moonbase.ini");
 	}
 
-	const char *filename = (char *)buffer + convertFilePath(buffer);
+	const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
 	debug(1, "Final filename to %s", filename);
 
 	slot = -1;
@@ -1547,7 +1547,7 @@
 	byte buffer[256];
 
 	copyScriptString(buffer, sizeof(buffer));
-	const char *filename = (char *)buffer + convertFilePath(buffer);
+	const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
 
 	debug(1, "o72_deleteFile(%s)", filename);
 
@@ -1562,8 +1562,8 @@
 	copyScriptString(buffer1, sizeof(buffer1));
 	copyScriptString(buffer2, sizeof(buffer2));
 
-	const char *newFilename = (char *)buffer1 + convertFilePath(buffer1);
-	const char *oldFilename = (char *)buffer2 + convertFilePath(buffer2);
+	const char *newFilename = (char *)buffer1 + convertFilePath(buffer1, sizeof(buffer1));
+	const char *oldFilename = (char *)buffer2 + convertFilePath(buffer2, sizeof(buffer2));
 
 	_saveFileMan->renameSavefile(oldFilename, newFilename);
 

Modified: scummvm/trunk/engines/scumm/he/script_v80he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/script_v80he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/script_v80he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -89,7 +89,7 @@
 	byte buffer[256];
 
 	copyScriptString(buffer, sizeof(buffer));
-	const char *filename = (char *)buffer + convertFilePath(buffer);
+	const char *filename = (char *)buffer + convertFilePath(buffer, sizeof(buffer));
 
 	Common::SeekableReadStream *f = 0;
 	if (!_saveFileMan->listSavefiles(filename).empty()) {
@@ -154,7 +154,7 @@
 	copyScriptString(section, sizeof(section));
 	copyScriptString(filename, sizeof(filename));
 
-	r = convertFilePath(filename);
+	r = convertFilePath(filename, sizeof(filename));
 
 	if (_game.id == GID_TREASUREHUNT) {
 		// WORKAROUND: Remove invalid characters
@@ -222,7 +222,7 @@
 		error("o80_writeConfigFile: default type %d", subOp);
 	}
 
-	r = convertFilePath(filename);
+	r = convertFilePath(filename, sizeof(filename));
 
 	if (_game.id == GID_TREASUREHUNT) {
 		// WORKAROUND: Remove invalid characters

Modified: scummvm/trunk/engines/scumm/he/script_v90he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/script_v90he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/script_v90he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -1426,7 +1426,7 @@
 			if (_videoParams.flags == 0)
 				_videoParams.flags = 4;
 
-			const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename);
+			const char *filename = (char *)_videoParams.filename + convertFilePath(_videoParams.filename, sizeof(_videoParams.filename));
 			if (_videoParams.flags & 2) {
 				VAR(119) = _moviePlay->load(filename, _videoParams.flags, _videoParams.wizResNum);
 			} else {

Modified: scummvm/trunk/engines/scumm/he/wiz_he.cpp
===================================================================
--- scummvm/trunk/engines/scumm/he/wiz_he.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/he/wiz_he.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -2083,7 +2083,7 @@
 			Common::File f;
 
 			memcpy(filename, params->filename, 260);
-			_vm->convertFilePath(filename);
+			_vm->convertFilePath(filename, sizeof(filename));
 
 			if (f.open((const char *)filename)) {
 				uint32 id = f.readUint32BE();
@@ -2126,7 +2126,7 @@
 				break;
 			case 0:
 				memcpy(filename, params->filename, 260);
-				_vm->convertFilePath(filename);
+				_vm->convertFilePath(filename, sizeof(filename));
 
 				if (!f.open((const char *)filename)) {
 					debug(0, "Unable to open for write '%s'", filename);

Modified: scummvm/trunk/engines/scumm/saveload.cpp
===================================================================
--- scummvm/trunk/engines/scumm/saveload.cpp	2009-07-23 10:31:06 UTC (rev 42674)
+++ scummvm/trunk/engines/scumm/saveload.cpp	2009-07-23 10:33:13 UTC (rev 42675)
@@ -86,6 +86,12 @@
 	// FIXME: Actually, we might wish to support loading in more places.
 	// As long as we are sure it won't cause any problems... Are we
 	// aware of *any* spots where loading is not supported?
+
+	// HE games are limited to original load and save interface only,
+	// due to numerous glitches (see bug #1726909) that can occur.
+	if (_game.heversion >= 60)
+		return false;
+
 	return (VAR_MAINMENU_KEY == 0xFF || VAR(VAR_MAINMENU_KEY) != 0);
 }
 
@@ -100,6 +106,11 @@
 	// e.g. when a SAN movie is playing? Not sure whether the
 	// original EXE allowed this.
 
+	// HE games are limited to original load and save interface only,
+	// due to numerous glitches (see bug #1726909) that can occur.
+	if (_game.heversion >= 60)
+		return false;
+
 	// SCUMM v4+ doesn't allow saving in room 0 or if  
 	// VAR(VAR_MAINMENU_KEY) to set to zero.
 	return (VAR_MAINMENU_KEY == 0xFF || (VAR(VAR_MAINMENU_KEY) != 0 && _currentRoom != 0));


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