Add support for original load/save system in HE games.

svn-id: r29434
This commit is contained in:
Travis Howell 2007-11-06 12:22:52 +00:00
parent 3598192859
commit 443dff5285
5 changed files with 69 additions and 33 deletions

View file

@ -568,11 +568,19 @@ void ScummEngine_v60he::o60_roomOps() {
copyPalColor(a, b);
break;
case 221:
int len;
byte buffer[100];
int len, r;
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
r = convertFilePath(buffer);
memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
debug(1, "o60_roomOps: case 221: filename %s", _saveLoadFileName);
_saveLoadFlag = pop();
_saveLoadSlot = 1;
_saveLoadSlot = 255;
_saveTemporaryState = true;
break;
case 234: // HE 7.2
@ -982,7 +990,6 @@ void ScummEngine_v60he::o60_openFile() {
const char *filename;
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
@ -1042,34 +1049,35 @@ void ScummEngine_v60he::o60_deleteFile() {
const char *filename;
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
filename = (char *)buffer + convertFilePath(buffer);
debug(1, "o60_deleteFile stub (\"%s\")", filename);
_saveFileMan->removeSavefile(filename);
}
void ScummEngine_v60he::o60_rename() {
int len;
byte buffer1[100], buffer2[100];
const char *filename1, *filename2;
const char *newFilename, *oldFilename;
convertMessageToString(_scriptPointer, buffer1, sizeof(buffer1));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
filename1 = (char *)buffer1 + convertFilePath(buffer1);
convertMessageToString(_scriptPointer, buffer2, sizeof(buffer2));
len = resStrLen(_scriptPointer);
_scriptPointer += len + 1;
filename2 = (char *)buffer2 + convertFilePath(buffer2);
oldFilename = (char *)buffer1 + convertFilePath(buffer1);
newFilename = (char *)buffer2 + convertFilePath(buffer2);
debug(1, "o60_rename stub (\"%s\" to \"%s\")", filename1, filename2);
debug(1, "o60_rename stub (\"%s\" to \"%s\")", newFilename, oldFilename);
_saveFileMan->renameSavefile(oldFilename, newFilename);
}
int ScummEngine_v60he::readFileToArray(int slot, int32 size) {

View file

@ -978,7 +978,6 @@ void ScummEngine_v72he::o72_getNumFreeArrays() {
void ScummEngine_v72he::o72_roomOps() {
int a, b, c, d, e;
byte filename[100];
byte subOp = fetchScriptByte();
@ -1051,11 +1050,17 @@ void ScummEngine_v72he::o72_roomOps() {
break;
case 221:
copyScriptString(filename, sizeof(filename));
debug(1, "o72_roomOps: case 221: filename %s", filename);
byte buffer[256];
int r;
copyScriptString((byte *)buffer, sizeof(buffer));
r = convertFilePath(buffer);
memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
debug(1, "o72_roomOps: case 221: filename %s", _saveLoadFileName);
_saveLoadFlag = pop();
_saveLoadSlot = 1;
_saveLoadSlot = 255;
_saveTemporaryState = true;
break;
@ -1871,18 +1876,26 @@ void ScummEngine_v72he::o72_findAllObjects() {
}
void ScummEngine_v72he::o72_deleteFile() {
byte filename[256];
byte buffer[256];
copyScriptString(filename, sizeof(filename));
copyScriptString(buffer, sizeof(buffer));
const char *filename = (char *)buffer + convertFilePath(buffer);
debug(1, "stub o72_deleteFile(%s)", filename);
_saveFileMan->removeSavefile(filename);
}
void ScummEngine_v72he::o72_rename() {
byte oldFilename[100],newFilename[100];
byte buffer1[100],buffer2[100];
copyScriptString(newFilename, sizeof(newFilename));
copyScriptString(oldFilename, sizeof(oldFilename));
copyScriptString(buffer1, sizeof(buffer1));
copyScriptString(buffer2, sizeof(buffer2));
const char *newFilename = (char *)buffer1 + convertFilePath(buffer1);
const char *oldFilename = (char *)buffer2 + convertFilePath(buffer2);
_saveFileMan->renameSavefile(oldFilename, newFilename);
debug(1, "stub o72_rename(%s to %s)", oldFilename, newFilename);
}

View file

@ -86,18 +86,7 @@ void ScummEngine::requestLoad(int slot) {
_saveLoadFlag = 2; // 2 for load
}
bool ScummEngine::saveState(int slot, bool compat) {
char filename[256];
Common::OutSaveFile *out;
SaveGameHeader hdr;
makeSavegameName(filename, slot, compat);
if (!(out = _saveFileMan->openForSaving(filename)))
return false;
memcpy(hdr.name, _saveLoadName, sizeof(hdr.name));
static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {
hdr.type = MKID_BE('SCVM');
hdr.size = 0;
hdr.ver = CURRENT_VER;
@ -106,6 +95,25 @@ bool ScummEngine::saveState(int slot, bool compat) {
out->writeUint32LE(hdr.size);
out->writeUint32LE(hdr.ver);
out->write(hdr.name, sizeof(hdr.name));
return true;
}
bool ScummEngine::saveState(int slot, bool compat) {
char filename[256];
Common::OutSaveFile *out;
SaveGameHeader hdr;
if (_saveLoadSlot == 255) {
// Allow custom filenames for save game system in HE Games
memcpy(filename, _saveLoadFileName, sizeof(_saveLoadFileName));
} else {
makeSavegameName(filename, slot, compat);
}
if (!(out = _saveFileMan->openForSaving(filename)))
return false;
memcpy(hdr.name, _saveLoadName, sizeof(hdr.name));
saveSaveGameHeader(out, hdr);
saveThumbnail(out);
saveInfos(out);
@ -137,7 +145,12 @@ bool ScummEngine::loadState(int slot, bool compat) {
SaveGameHeader hdr;
int sb, sh;
if (_saveLoadSlot == 255) {
// Allow custom filenames for save game system in HE Games
memcpy(filename, _saveLoadFileName, sizeof(_saveLoadFileName));
} else {
makeSavegameName(filename, slot, compat);
}
if (!(in = _saveFileMan->openForLoading(filename)))
return false;

View file

@ -200,6 +200,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
_saveLoadSlot = 0;
_lastSaveTime = 0;
_saveTemporaryState = false;
memset(_saveLoadFileName, 0, sizeof(_saveLoadFileName));
memset(_saveLoadName, 0, sizeof(_saveLoadName));
memset(_localScriptOffsets, 0, sizeof(_localScriptOffsets));
_scriptPointer = NULL;

View file

@ -607,6 +607,7 @@ protected:
byte _saveLoadFlag, _saveLoadSlot;
uint32 _lastSaveTime;
bool _saveTemporaryState;
char _saveLoadFileName[32];
char _saveLoadName[32];
bool saveState(int slot, bool compat);