Add support for original load/save system in HE games.
svn-id: r29434
This commit is contained in:
parent
3598192859
commit
443dff5285
5 changed files with 69 additions and 33 deletions
|
@ -568,11 +568,19 @@ void ScummEngine_v60he::o60_roomOps() {
|
||||||
copyPalColor(a, b);
|
copyPalColor(a, b);
|
||||||
break;
|
break;
|
||||||
case 221:
|
case 221:
|
||||||
int len;
|
byte buffer[100];
|
||||||
|
int len, r;
|
||||||
|
|
||||||
|
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
|
||||||
len = resStrLen(_scriptPointer);
|
len = resStrLen(_scriptPointer);
|
||||||
_scriptPointer += len + 1;
|
_scriptPointer += len + 1;
|
||||||
|
|
||||||
|
r = convertFilePath(buffer);
|
||||||
|
memcpy(_saveLoadFileName, buffer + r, sizeof(buffer) - r);
|
||||||
|
debug(1, "o60_roomOps: case 221: filename %s", _saveLoadFileName);
|
||||||
|
|
||||||
_saveLoadFlag = pop();
|
_saveLoadFlag = pop();
|
||||||
_saveLoadSlot = 1;
|
_saveLoadSlot = 255;
|
||||||
_saveTemporaryState = true;
|
_saveTemporaryState = true;
|
||||||
break;
|
break;
|
||||||
case 234: // HE 7.2
|
case 234: // HE 7.2
|
||||||
|
@ -982,7 +990,6 @@ void ScummEngine_v60he::o60_openFile() {
|
||||||
const char *filename;
|
const char *filename;
|
||||||
|
|
||||||
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
|
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
|
||||||
|
|
||||||
len = resStrLen(_scriptPointer);
|
len = resStrLen(_scriptPointer);
|
||||||
_scriptPointer += len + 1;
|
_scriptPointer += len + 1;
|
||||||
|
|
||||||
|
@ -1042,34 +1049,35 @@ void ScummEngine_v60he::o60_deleteFile() {
|
||||||
const char *filename;
|
const char *filename;
|
||||||
|
|
||||||
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
|
convertMessageToString(_scriptPointer, buffer, sizeof(buffer));
|
||||||
|
|
||||||
len = resStrLen(_scriptPointer);
|
len = resStrLen(_scriptPointer);
|
||||||
_scriptPointer += len + 1;
|
_scriptPointer += len + 1;
|
||||||
|
|
||||||
filename = (char *)buffer + convertFilePath(buffer);
|
filename = (char *)buffer + convertFilePath(buffer);
|
||||||
|
|
||||||
debug(1, "o60_deleteFile stub (\"%s\")", filename);
|
debug(1, "o60_deleteFile stub (\"%s\")", filename);
|
||||||
|
|
||||||
|
_saveFileMan->removeSavefile(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine_v60he::o60_rename() {
|
void ScummEngine_v60he::o60_rename() {
|
||||||
int len;
|
int len;
|
||||||
byte buffer1[100], buffer2[100];
|
byte buffer1[100], buffer2[100];
|
||||||
const char *filename1, *filename2;
|
const char *newFilename, *oldFilename;
|
||||||
|
|
||||||
convertMessageToString(_scriptPointer, buffer1, sizeof(buffer1));
|
convertMessageToString(_scriptPointer, buffer1, sizeof(buffer1));
|
||||||
|
|
||||||
len = resStrLen(_scriptPointer);
|
len = resStrLen(_scriptPointer);
|
||||||
_scriptPointer += len + 1;
|
_scriptPointer += len + 1;
|
||||||
|
|
||||||
filename1 = (char *)buffer1 + convertFilePath(buffer1);
|
|
||||||
|
|
||||||
convertMessageToString(_scriptPointer, buffer2, sizeof(buffer2));
|
convertMessageToString(_scriptPointer, buffer2, sizeof(buffer2));
|
||||||
|
|
||||||
len = resStrLen(_scriptPointer);
|
len = resStrLen(_scriptPointer);
|
||||||
_scriptPointer += len + 1;
|
_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) {
|
int ScummEngine_v60he::readFileToArray(int slot, int32 size) {
|
||||||
|
|
|
@ -978,7 +978,6 @@ void ScummEngine_v72he::o72_getNumFreeArrays() {
|
||||||
|
|
||||||
void ScummEngine_v72he::o72_roomOps() {
|
void ScummEngine_v72he::o72_roomOps() {
|
||||||
int a, b, c, d, e;
|
int a, b, c, d, e;
|
||||||
byte filename[100];
|
|
||||||
|
|
||||||
byte subOp = fetchScriptByte();
|
byte subOp = fetchScriptByte();
|
||||||
|
|
||||||
|
@ -1051,11 +1050,17 @@ void ScummEngine_v72he::o72_roomOps() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 221:
|
case 221:
|
||||||
copyScriptString(filename, sizeof(filename));
|
byte buffer[256];
|
||||||
debug(1, "o72_roomOps: case 221: filename %s", filename);
|
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();
|
_saveLoadFlag = pop();
|
||||||
_saveLoadSlot = 1;
|
_saveLoadSlot = 255;
|
||||||
_saveTemporaryState = true;
|
_saveTemporaryState = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1871,18 +1876,26 @@ void ScummEngine_v72he::o72_findAllObjects() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine_v72he::o72_deleteFile() {
|
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);
|
debug(1, "stub o72_deleteFile(%s)", filename);
|
||||||
|
|
||||||
|
_saveFileMan->removeSavefile(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScummEngine_v72he::o72_rename() {
|
void ScummEngine_v72he::o72_rename() {
|
||||||
byte oldFilename[100],newFilename[100];
|
byte buffer1[100],buffer2[100];
|
||||||
|
|
||||||
copyScriptString(newFilename, sizeof(newFilename));
|
copyScriptString(buffer1, sizeof(buffer1));
|
||||||
copyScriptString(oldFilename, sizeof(oldFilename));
|
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);
|
debug(1, "stub o72_rename(%s to %s)", oldFilename, newFilename);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,18 +86,7 @@ void ScummEngine::requestLoad(int slot) {
|
||||||
_saveLoadFlag = 2; // 2 for load
|
_saveLoadFlag = 2; // 2 for load
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScummEngine::saveState(int slot, bool compat) {
|
static bool saveSaveGameHeader(Common::OutSaveFile *out, SaveGameHeader &hdr) {
|
||||||
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));
|
|
||||||
|
|
||||||
hdr.type = MKID_BE('SCVM');
|
hdr.type = MKID_BE('SCVM');
|
||||||
hdr.size = 0;
|
hdr.size = 0;
|
||||||
hdr.ver = CURRENT_VER;
|
hdr.ver = CURRENT_VER;
|
||||||
|
@ -106,6 +95,25 @@ bool ScummEngine::saveState(int slot, bool compat) {
|
||||||
out->writeUint32LE(hdr.size);
|
out->writeUint32LE(hdr.size);
|
||||||
out->writeUint32LE(hdr.ver);
|
out->writeUint32LE(hdr.ver);
|
||||||
out->write(hdr.name, sizeof(hdr.name));
|
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);
|
saveThumbnail(out);
|
||||||
saveInfos(out);
|
saveInfos(out);
|
||||||
|
|
||||||
|
@ -137,7 +145,12 @@ bool ScummEngine::loadState(int slot, bool compat) {
|
||||||
SaveGameHeader hdr;
|
SaveGameHeader hdr;
|
||||||
int sb, sh;
|
int sb, sh;
|
||||||
|
|
||||||
makeSavegameName(filename, slot, compat);
|
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)))
|
if (!(in = _saveFileMan->openForLoading(filename)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
|
||||||
_saveLoadSlot = 0;
|
_saveLoadSlot = 0;
|
||||||
_lastSaveTime = 0;
|
_lastSaveTime = 0;
|
||||||
_saveTemporaryState = false;
|
_saveTemporaryState = false;
|
||||||
|
memset(_saveLoadFileName, 0, sizeof(_saveLoadFileName));
|
||||||
memset(_saveLoadName, 0, sizeof(_saveLoadName));
|
memset(_saveLoadName, 0, sizeof(_saveLoadName));
|
||||||
memset(_localScriptOffsets, 0, sizeof(_localScriptOffsets));
|
memset(_localScriptOffsets, 0, sizeof(_localScriptOffsets));
|
||||||
_scriptPointer = NULL;
|
_scriptPointer = NULL;
|
||||||
|
|
|
@ -607,6 +607,7 @@ protected:
|
||||||
byte _saveLoadFlag, _saveLoadSlot;
|
byte _saveLoadFlag, _saveLoadSlot;
|
||||||
uint32 _lastSaveTime;
|
uint32 _lastSaveTime;
|
||||||
bool _saveTemporaryState;
|
bool _saveTemporaryState;
|
||||||
|
char _saveLoadFileName[32];
|
||||||
char _saveLoadName[32];
|
char _saveLoadName[32];
|
||||||
|
|
||||||
bool saveState(int slot, bool compat);
|
bool saveState(int slot, bool compat);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue