diff options
Diffstat (limited to 'engines/sci/engine/kfile.cpp')
| -rw-r--r-- | engines/sci/engine/kfile.cpp | 45 | 
1 files changed, 40 insertions, 5 deletions
| 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 | 
