aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorColin Snover2016-09-15 08:54:10 -0500
committerColin Snover2016-09-29 19:39:16 -0500
commit1eb6d90eec4aa2dab3532e9630c81b6b3dbddafb (patch)
treec18f725995654edd1bf903fd527719683d1df951 /engines/sci/engine
parentb5d0fffb8b111c5d8154a37ba9a0d7b18866c7dd (diff)
downloadscummvm-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.h8
-rw-r--r--engines/sci/engine/kfile.cpp45
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