diff options
-rw-r--r-- | engines/sci/engine/kmovement.cpp | 11 | ||||
-rw-r--r-- | engines/sci/engine/kscripts.cpp | 22 |
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); } |