[Scummvm-cvs-logs] SF.net SVN: scummvm:[55251] scummvm/trunk/engines/sci/engine

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sat Jan 15 19:25:10 CET 2011


Revision: 55251
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55251&view=rev
Author:   thebluegr
Date:     2011-01-15 18:25:10 +0000 (Sat, 15 Jan 2011)

Log Message:
-----------
SCI: Added a hack to fix bug #3122075 - "LB1: Game play freezes when taking shower"

This is a regression from the new kInitBresen/kDoBresen functions, enabled in r52467.
Many thanks to waltervn for his work in bisecting this. The actual bug should be
found, but since only this death scene has an issue, it's not really worth the
effort. The old functions are based on observations, so there are many differences in
the way that they behave. If another test case is found, then this shall be examined
further. Until then, this simple and unobtrusive hack will do.

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kmovement.cpp
    scummvm/trunk/engines/sci/engine/kscripts.cpp

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2011-01-15 12:18:13 UTC (rev 55250)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2011-01-15 18:25:10 UTC (rev 55251)
@@ -166,6 +166,17 @@
 	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];

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2011-01-15 12:18:13 UTC (rev 55250)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2011-01-15 18:25:10 UTC (rev 55251)
@@ -264,6 +264,28 @@
 		}
 	}
 
+	// 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);
 }
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list