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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Fri Sep 10 22:14:37 CEST 2010


Revision: 52668
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52668&view=rev
Author:   m_kiewitz
Date:     2010-09-10 20:14:37 +0000 (Fri, 10 Sep 2010)

Log Message:
-----------
SCI: adding patch for castle brain cipher puzzle

reinitializes puzzle each time its shown. Fixes save/restore bug in that room, bug #3063510

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

Modified: scummvm/trunk/engines/sci/engine/script_patches.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/script_patches.cpp	2010-09-10 14:07:32 UTC (rev 52667)
+++ scummvm/trunk/engines/sci/engine/script_patches.cpp	2010-09-10 20:14:37 UTC (rev 52668)
@@ -56,6 +56,51 @@
 //  - rinse and repeat
 
 // ===========================================================================
+// Castle of Dr. Brain
+// cipher::init (script 391) is called on room 380 init. This resets the word
+//  cipher puzzle. The puzzle sadly operates on some hep strings, which aren't
+//  saved in our sci. So saving/restoring in this room will break the puzzle
+//  Because of this issue, we just init the puzzle each time it's accessed.
+//  this is not 100% sierra behaviour, in fact we will actually reset the puzzle
+//  during each access which makes it impossible to cheat.
+const byte castlebrainSignatureCipherPuzzle[] = {
+	22,
+	0x35, 0x00,        // ldi 00
+	0xa3, 0x26,        // sal local[26]
+	0xa3, 0x25,        // sal local[25]
+	0x35, 0x00,        // ldi 00
+	0xa3, 0x2a,        // sal local[2a] (local is not used)
+	0xa3, 0x29,        // sal local[29] (local is not used)
+	0x35, 0xff,        // ldi ff
+	0xa3, 0x2c,        // sal local[2c]
+	0xa3, 0x2b,        // sal local[2b]
+	0x35, 0x00,        // ldi 00
+	0x65, 0x16,        // aTop highlightedIcon
+	0
+};
+
+const uint16 castlebrainPatchCipherPuzzle[] = {
+	0x39, 0x6b,        // pushi 6b (selector init)
+	0x76,              // push0
+	0x55, 0x04,        // self 04
+	0x35, 0x00,        // ldi 00
+	0xa3, 0x25,        // sal local[25]
+	0xa3, 0x26,        // sal local[26]
+	0xa3, 0x29,        // sal local[29]
+	0x65, 0x16,        // aTop highlightedIcon
+	0x34, 0xff, 0xff,  // ldi ffff
+	0xa3, 0x2b,        // sal local[2b]
+	0xa3, 0x2c,        // sal local[2c]
+	PATCH_END
+};
+
+//    script, description,                                      magic DWORD,                             adjust
+const SciScriptSignature castlebrainSignatures[] = {
+    {    391, "cipher puzzle save/restore break",            1, PATCH_MAGICDWORD(0xa3, 0x26, 0xa3, 0x25),    -2, castlebrainSignatureCipherPuzzle, castlebrainPatchCipherPuzzle },
+    SCI_SIGNATUREENTRY_TERMINATOR
+};
+
+// ===========================================================================
 // stayAndHelp::changeState (0) is called when ego swims to the left or right
 //  boundaries of room 660. Normally a textbox is supposed to get on screen
 //  but the call is wrong, so not only do we get an error message the script
@@ -793,6 +838,9 @@
 void Script::matchSignatureAndPatch(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) {
 	const SciScriptSignature *signatureTable = NULL;
 	switch (g_sci->getGameId()) {
+	case GID_CASTLEBRAIN:
+		signatureTable = castlebrainSignatures;
+		break;
 	case GID_ECOQUEST:
 		signatureTable = ecoquest1Signatures;
 		break;


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