aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Snover2017-08-05 22:31:14 -0500
committerColin Snover2017-09-03 20:58:09 -0500
commit6e35676a9efa9247edccd7acca069610f1a493ee (patch)
treef4a3d19c044568f98af246f186ba578bf95f794f
parentbe64c6ba8b5f4a81e6703b5a6325b7a7112c14d4 (diff)
downloadscummvm-rg350-6e35676a9efa9247edccd7acca069610f1a493ee.tar.gz
scummvm-rg350-6e35676a9efa9247edccd7acca069610f1a493ee.tar.bz2
scummvm-rg350-6e35676a9efa9247edccd7acca069610f1a493ee.zip
SCI32: Fix load from launcher for Lighthouse
Launcher loads of games without a saved Robot were fine, but games that were saved with a Robot (e.g. room 480 when facing the water) would crash.
-rw-r--r--engines/sci/engine/guest_additions.cpp45
-rw-r--r--engines/sci/engine/guest_additions.h4
-rw-r--r--engines/sci/engine/kvideo.cpp6
3 files changed, 39 insertions, 16 deletions
diff --git a/engines/sci/engine/guest_additions.cpp b/engines/sci/engine/guest_additions.cpp
index 17ae74e25a..0e4e35f7d8 100644
--- a/engines/sci/engine/guest_additions.cpp
+++ b/engines/sci/engine/guest_additions.cpp
@@ -254,28 +254,47 @@ void GuestAdditions::segManSaveLoadScriptHook(Script &script) const {
#endif
bool GuestAdditions::kGetEventHook() const {
- if (_state->_delayedRestoreGameId != -1) {
- return g_sci->_guestAdditions->restoreFromLauncher();
+ if (_state->_delayedRestoreGameId == -1) {
+ return false;
+ }
+
+ // Loading a save game while Lighthouse is still initializing itself will
+ // cause loading to fail if the save game contains a saved Robot state,
+ // because the Robot will try to restore itself into a game plane which does
+ // not exist yet
+ if (g_sci->getGameId() == GID_LIGHTHOUSE) {
+ Common::List<ExecStack>::const_iterator it;
+ for (it = _state->_executionStack.begin(); it != _state->_executionStack.end(); ++it) {
+ const ExecStack &call = *it;
+ const reg_t gameObject = g_sci->getGameObject();
+ if (call.sendp == gameObject && call.debugSelector == SELECTOR(init)) {
+ return false;
+ }
+ }
}
- return false;
+
+ return g_sci->_guestAdditions->restoreFromLauncher();
}
bool GuestAdditions::kWaitHook() const {
- if (_state->_delayedRestoreGameId != -1 &&
- // kWait cannot be used in Phant2 for delayed restore because it is
- // called during the fade-in of music in the intro room, before graphics
- // are fully initialized, which causes "Click to continue" text to be
- // brokenly drawn over the game and then crashes the engine on the next
- // room transition
- g_sci->getGameId() != GID_PHANTASMAGORIA2) {
+ if (_state->_delayedRestoreGameId == -1) {
+ return false;
+ }
- return g_sci->_guestAdditions->restoreFromLauncher();
+ // kWait cannot be used in Phant2 for delayed restore because it is
+ // called during the fade-in of music in the intro room, before graphics
+ // are fully initialized, which causes "Click to continue" text to be
+ // brokenly drawn over the game and then crashes the engine on the next
+ // room transition
+ if (g_sci->getGameId() == GID_PHANTASMAGORIA2) {
+ return false;
}
- return false;
+
+ return g_sci->_guestAdditions->restoreFromLauncher();
}
#ifdef ENABLE_SCI32
-bool GuestAdditions::kPlayDuckPlayHook() const {
+bool GuestAdditions::kPlayDuckPlayVMDHook() const {
return _state->_delayedRestoreGameId != -1;
}
#endif
diff --git a/engines/sci/engine/guest_additions.h b/engines/sci/engine/guest_additions.h
index cfa1139c5f..36264b946b 100644
--- a/engines/sci/engine/guest_additions.h
+++ b/engines/sci/engine/guest_additions.h
@@ -148,9 +148,9 @@ public:
#ifdef ENABLE_SCI32
/**
- * Guest additions hook for kPlayDuck(Play).
+ * Guest additions hook for kPlayDuck(Play) and kPlayVMD(PlayUntilEvent).
*/
- bool kPlayDuckPlayHook() const;
+ bool kPlayDuckPlayVMDHook() const;
#endif
#pragma mark -
diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp
index feb98f2eef..98b2ba2b85 100644
--- a/engines/sci/engine/kvideo.cpp
+++ b/engines/sci/engine/kvideo.cpp
@@ -444,6 +444,10 @@ reg_t kPlayVMDGetStatus(EngineState *s, int argc, reg_t *argv) {
}
reg_t kPlayVMDPlayUntilEvent(EngineState *s, int argc, reg_t *argv) {
+ if (g_sci->_guestAdditions->kPlayDuckPlayVMDHook()) {
+ return make_reg(0, VMDPlayer::kEventFlagEnd);
+ }
+
const VMDPlayer::EventFlags flags = (VMDPlayer::EventFlags)argv[0].toUint16();
const int16 lastFrameNo = argc > 1 ? argv[1].toSint16() : -1;
const int16 yieldInterval = argc > 2 ? argv[2].toSint16() : -1;
@@ -485,7 +489,7 @@ reg_t kPlayDuck(EngineState *s, int argc, reg_t *argv) {
}
reg_t kPlayDuckPlay(EngineState *s, int argc, reg_t *argv) {
- if (g_sci->_guestAdditions->kPlayDuckPlayHook()) {
+ if (g_sci->_guestAdditions->kPlayDuckPlayVMDHook()) {
return NULL_REG;
}
kPlayDuckOpen(s, argc, argv);