[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