diff options
author | Filippos Karapetis | 2010-05-31 12:13:50 +0000 |
---|---|---|
committer | Filippos Karapetis | 2010-05-31 12:13:50 +0000 |
commit | cc025ace18b2bd47e81d4ec1ac46aa9abb566c16 (patch) | |
tree | ce3c5387100a52aec27c85b34104d14498bcd41a | |
parent | a963917e89f0f4d404872473c99fd998938984b2 (diff) | |
download | scummvm-rg350-cc025ace18b2bd47e81d4ec1ac46aa9abb566c16.tar.gz scummvm-rg350-cc025ace18b2bd47e81d4ec1ac46aa9abb566c16.tar.bz2 scummvm-rg350-cc025ace18b2bd47e81d4ec1ac46aa9abb566c16.zip |
The code that loads saved game from the launcher
can now load SCI2 saved games. Added an explanation
why the injected call is necessary
svn-id: r49349
-rw-r--r-- | engines/sci/engine/vm.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 03d67ae451..f18a3844eb 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -593,19 +593,25 @@ static void callKernelFunc(EngineState *s, int kernelFuncNum, int argc) { //warning("callk %s", kernelFunc.orig_name.c_str()); - // TODO: SCI2/SCI2.1+ equivalent, once saving/loading works in SCI2/SCI2.1+ - if (g_loadFromLauncher >= 0 && kernelFuncNum == 0x8) { - // A game is being loaded from the launcher, and kDisplay is called, all initialization has taken - // place (i.e. menus have been constructed etc). Therefore, inject a kRestoreGame call - // here, instead of the requested function. - int saveSlot = g_loadFromLauncher; - g_loadFromLauncher = -1; // invalidate slot, so that we don't load again - - if (saveSlot < 0) - error("Requested to load invalid save slot"); // should never happen, really - - reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL) - kRestoreGame(s, 2, restoreArgv); + // TODO: SCI2.1 equivalent + if (g_loadFromLauncher >= 0 && + (kernelFuncNum == 0x8 && getSciVersion() <= SCI_VERSION_1_1) || // DrawPic + (kernelFuncNum == 0x3d && getSciVersion() == SCI_VERSION_2)) { // GetSaveDir + //(kernelFuncNum == 0x28 && getSciVersion() == SCI_VERSION_2_1)) { // AddPlane + + // A game is being loaded from the launcher, and the game is about to draw something on + // screen, hence all initialization has taken place (i.e. menus have been constructed etc). + // Therefore, inject a kRestoreGame call here, instead of the requested function. + // The restore call is injected here mainly for games which have a menu, as the menu is + // constructed when the game starts and is not reconstructed when a saved game is loaded. + int saveSlot = g_loadFromLauncher; + g_loadFromLauncher = -1; // invalidate slot, so that we don't load again + + if (saveSlot < 0) + error("Requested to load invalid save slot"); // should never happen, really + + reg_t restoreArgv[2] = { NULL_REG, make_reg(0, saveSlot) }; // special call (argv[0] is NULL) + kRestoreGame(s, 2, restoreArgv); } else { // Call kernel function s->r_acc = kernelFunc.fun(s, argc, argv); |