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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Mon Sep 13 00:09:01 CEST 2010


Revision: 52695
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52695&view=rev
Author:   m_kiewitz
Date:     2010-09-12 22:09:01 +0000 (Sun, 12 Sep 2010)

Log Message:
-----------
SCI: patching cleanup (+orgbyte/adjust command)

the new commands were meant for castle/brain hangman puzzle patch, but the patch didn't work well, so I removed it. Still the commands could/should come in handy

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-12 21:56:37 UTC (rev 52694)
+++ scummvm/trunk/engines/sci/engine/script_patches.cpp	2010-09-12 22:09:01 UTC (rev 52695)
@@ -32,9 +32,14 @@
 namespace Sci {
 
 #define PATCH_END             0xFFFF
-#define PATCH_ADDTOOFFSET     0x8000
-#define PATCH_GETORIGINALBYTE 0x4000
+#define PATCH_COMMANDMASK     0xF000
+#define PATCH_VALUEMASK       0x0FFF
+#define PATCH_ADDTOOFFSET     0xE000
+#define PATCH_GETORIGINALBYTE 0xD000
+#define PATCH_ADJUSTWORD      0xC000
+#define PATCH_ADJUSTWORD_NEG  0xB000
 #define PATCH_MAGICDWORD(a, b, c, d) CONSTANT_LE_32(a | (b << 8) | (c << 16) | (d << 24))
+#define PATCH_VALUELIMIT      4096
 
 struct SciScriptSignature {
 	uint16 scriptNr;
@@ -779,19 +784,50 @@
 
 // will actually patch previously found signature area
 void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scriptSize, int32 signatureOffset) {
+	byte orgData[PATCH_VALUELIMIT];
 	int32 offset = signatureOffset;
 	uint16 patchWord = *patch;
 
+	// Copy over original bytes from script
+	uint32 orgDataSize = scriptSize - offset;
+	if (orgDataSize > PATCH_VALUELIMIT)
+		orgDataSize = PATCH_VALUELIMIT;
+	memcpy(&orgData, &scriptData[offset], orgDataSize);
+
 	while (patchWord != PATCH_END) {
-		if (patchWord & PATCH_ADDTOOFFSET) {
-			offset += patchWord & ~PATCH_ADDTOOFFSET;
-		} else if (patchWord & PATCH_GETORIGINALBYTE) {
-			// TODO: implement this
-			// Can be used to patch in some bytes from the original script into another location
-		} else {
-			scriptData[offset] = patchWord & 0xFF;
+		uint16 patchValue = patchWord & PATCH_VALUEMASK;
+		switch (patchWord & PATCH_COMMANDMASK) {
+		case PATCH_ADDTOOFFSET:
+			// add value to offset
+			offset += patchValue & ~PATCH_ADDTOOFFSET;
+			break;
+		case PATCH_GETORIGINALBYTE:
+			// get original byte from script
+			if (patchValue >= orgDataSize)
+				error("patching: can not get requested original byte from script");
+			scriptData[offset] = orgData[patchValue];
 			offset++;
+			break;
+		case PATCH_ADJUSTWORD: {
+			// Adjust word right before current position
+			byte *adjustPtr = &scriptData[offset - 2];
+			uint16 adjustWord = READ_LE_UINT16(adjustPtr);
+			adjustWord += patchValue;
+			WRITE_LE_UINT16(adjustPtr, adjustWord);
+			break;
 		}
+		case PATCH_ADJUSTWORD_NEG: {
+			// Adjust word right before current position (negative way)
+			byte *adjustPtr = &scriptData[offset - 2];
+			uint16 adjustWord = READ_LE_UINT16(adjustPtr);
+			adjustWord -= patchValue;
+			WRITE_LE_UINT16(adjustPtr, adjustWord);
+			break;
+		}
+		default:
+			scriptData[offset] = patchValue & 0xFF;
+			offset++;
+		}
 		patch++;
 		patchWord = *patch;
 	}	


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