aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/engine/kmovement.cpp11
-rw-r--r--engines/sci/engine/kscripts.cpp22
2 files changed, 33 insertions, 0 deletions
diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp
index 49f2ae4517..3c516f63f2 100644
--- a/engines/sci/engine/kmovement.cpp
+++ b/engines/sci/engine/kmovement.cpp
@@ -166,6 +166,17 @@ reg_t kSetJump(EngineState *s, int argc, reg_t *argv) {
return s->r_acc;
}
+// TODO/FIXME: There is a notable regression with the new kInitBresed/kDoBresen
+// functions below in a death scene of LB1 - the shower scene, room 215 (bug
+// #3122075). There is a hack to get around this bug by modifying the actor's
+// position for that scene in kScriptID. The actual bug should be found, but
+// since only this death scene has an issue, it's not really worth the effort.
+// The new kInitBresen/kDoBresen functions have been enabled in r52467. The
+// old ones are based on observations, so there are many differences in the
+// way that they behave. Check the hack in kScriptID for more info. Note that
+// the actual issue might not be with kInitBresen/kDoBresen, and there might
+// be another underlying problem here.
+
reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) {
SegManager *segMan = s->_segMan;
reg_t mover = argv[0];
diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp
index 79cde7c5d9..810e8a13ee 100644
--- a/engines/sci/engine/kscripts.cpp
+++ b/engines/sci/engine/kscripts.cpp
@@ -264,6 +264,28 @@ reg_t kScriptID(EngineState *s, int argc, reg_t *argv) {
}
}
+ // HACK: Prevent the murderer from getting stuck behind the door in
+ // Colonel's Bequest, room 215. A temporary fix for bug #3122075.
+ // TODO/FIXME: Add a proper fix for this. There is a regression in this
+ // scene with the new kInitBresen and kDoBresen functions (r52467). Using
+ // just the "old" kInitBresen works. This hack is added for now because the
+ // two functions are quite complex. The "old" versions were created based
+ // on observations, and not on the interpreter itself, thus they have a lot
+ // of differences in the way they behave and set variables to the mover object.
+ // Since this is just a death scene where Laura is supposed to die anyway,
+ // figuring out the exact cause of this is just not worth the effort.
+ // Differences between the new and the old kInitBresen to the MoveTo object:
+ // dy: 1 (new) - 2 (old)
+ // b-i1: 20 (new) - 12 (old)
+ // b-di: 65526 (new) - 65516 (old)
+ // Performing the changes above to MoveTo (0017:033a) allows the killer to
+ // move. Note that the actual issue might not be with kInitBresen/kDoBresen,
+ // and there might be another underlying problem here.
+ if (g_sci->getGameId() == GID_LAURABOW && script == 215) {
+ warning("Moving actor position for the shower scene of Colonel's Bequest");
+ writeSelectorValue(s->_segMan, s->_segMan->findObjectByName("killer"), SELECTOR(x), 6);
+ }
+
return make_reg(scriptSeg, address);
}