diff options
| author | Colin Snover | 2016-09-15 08:54:10 -0500 |
|---|---|---|
| committer | Colin Snover | 2016-09-29 19:39:16 -0500 |
| commit | 1eb6d90eec4aa2dab3532e9630c81b6b3dbddafb (patch) | |
| tree | c18f725995654edd1bf903fd527719683d1df951 /engines/sci/engine | |
| parent | b5d0fffb8b111c5d8154a37ba9a0d7b18866c7dd (diff) | |
| download | scummvm-rg350-1eb6d90eec4aa2dab3532e9630c81b6b3dbddafb.tar.gz scummvm-rg350-1eb6d90eec4aa2dab3532e9630c81b6b3dbddafb.tar.bz2 scummvm-rg350-1eb6d90eec4aa2dab3532e9630c81b6b3dbddafb.zip | |
SCI32: Implement ScummVM save/load
Diffstat (limited to 'engines/sci/engine')
| -rw-r--r-- | engines/sci/engine/kernel_tables.h | 8 | ||||
| -rw-r--r-- | engines/sci/engine/kfile.cpp | 45 |
2 files changed, 44 insertions, 9 deletions
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index c74b3ae1fb..e11326fc47 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -351,8 +351,8 @@ static const SciKernelMapSubEntry kPalCycle_subops[] = { // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kSave_subops[] = { - { SIG_SCI32, 0, MAP_CALL(SaveGame32), "rir[r0]", NULL }, - { SIG_SCI32, 1, MAP_CALL(RestoreGame32), "ri[r0]", NULL }, + { SIG_SCI32, 0, MAP_CALL(SaveGame32), "[r0]i[r0][r0]", NULL }, + { SIG_SCI32, 1, MAP_CALL(RestoreGame32), "[r0]i[r0]", NULL }, // System script 64994 in several SCI2.1mid games (KQ7 2.00b, Phant1, // PQ:SWAT, SQ6, Torin) calls GetSaveDir with an extra unused argument, and // it is easier to just handle it here than to bother with creating @@ -754,12 +754,12 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(RespondsTo), SIG_EVERYWHERE, ".i", NULL, NULL }, { MAP_CALL(RestartGame), SIG_EVERYWHERE, "", NULL, NULL }, #ifdef ENABLE_SCI32 - { "RestoreGame", kRestoreGame32, SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "ri[r0]", NULL, NULL }, + { "RestoreGame", kRestoreGame32, SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "[r0]i[r0]", NULL, NULL }, #endif { MAP_CALL(RestoreGame), SIG_EVERYWHERE, "[r0]i[r0]", NULL, NULL }, { MAP_CALL(Said), SIG_EVERYWHERE, "[r0]", NULL, NULL }, #ifdef ENABLE_SCI32 - { "SaveGame", kSaveGame32, SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "rir[r0]", NULL, NULL }, + { "SaveGame", kSaveGame32, SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "[r0]i[r0][r0]", NULL, NULL }, #endif { MAP_CALL(SaveGame), SIG_SCI16, SIGFOR_ALL, "[r0]i[r0](r0)", NULL, NULL }, { MAP_CALL(ScriptID), SIG_EVERYWHERE, "[io](i)", NULL, NULL }, diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 7e5af79b23..50560be7d1 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -1077,10 +1077,32 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { #ifdef ENABLE_SCI32 reg_t kSaveGame32(EngineState *s, int argc, reg_t *argv) { - const Common::String gameName = s->_segMan->getString(argv[0]); - int16 saveNo = argv[1].toSint16(); - const Common::String saveDescription = s->_segMan->getString(argv[2]); - const Common::String gameVersion = argv[3].isNull() ? "" : s->_segMan->getString(argv[3]); + Common::String gameName = ""; + int16 saveNo; + Common::String saveDescription; + Common::String gameVersion = (argc <= 3 || argv[3].isNull()) ? "" : s->_segMan->getString(argv[3]); + + if (argv[0].isNull()) { + // ScummVM call, from a patched Game::save + g_sci->_soundCmd->pauseAll(true); + GUI::SaveLoadChooser dialog(_("Save game:"), _("Save"), true); + saveNo = dialog.runModalWithCurrentTarget(); + g_sci->_soundCmd->pauseAll(false); + + if (saveNo < 0) { + return NULL_REG; + } + + saveDescription = dialog.getResultString(); + if (saveDescription.empty()) { + saveDescription = dialog.createDefaultSaveDescription(saveNo); + } + } else { + // Native script call + gameName = s->_segMan->getString(argv[0]); + saveNo = argv[1].toSint16(); + saveDescription = argv[2].isNull() ? "" : s->_segMan->getString(argv[2]); + } // Auto-save system used by Torin and LSL7 if (gameName == "Autosave" || gameName == "Autosv") { @@ -1149,10 +1171,23 @@ reg_t kSaveGame32(EngineState *s, int argc, reg_t *argv) { } reg_t kRestoreGame32(EngineState *s, int argc, reg_t *argv) { - const Common::String gameName = s->_segMan->getString(argv[0]); + Common::String gameName = ""; int16 saveNo = argv[1].toSint16(); const Common::String gameVersion = argv[2].isNull() ? "" : s->_segMan->getString(argv[2]); + if (argv[0].isNull() && saveNo == -1) { + // ScummVM call, either from lancher or a patched Game::restore + g_sci->_soundCmd->pauseAll(true); + GUI::SaveLoadChooser dialog(_("Restore game:"), _("Restore"), false); + saveNo = dialog.runModalWithCurrentTarget(); + g_sci->_soundCmd->pauseAll(false); + if (saveNo < 0) { + return s->r_acc; + } + } else { + gameName = s->_segMan->getString(argv[0]); + } + if (gameName == "Autosave" || gameName == "Autosv") { if (saveNo == 0) { // Autosave slot 0 is the autosave |
