[Scummvm-cvs-logs] SF.net SVN: scummvm:[33620] scummvm/trunk/engines/cine/various.cpp

buddha_ at users.sourceforge.net buddha_ at users.sourceforge.net
Mon Aug 4 21:32:58 CEST 2008


Revision: 33620
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33620&view=rev
Author:   buddha_
Date:     2008-08-04 19:32:52 +0000 (Mon, 04 Aug 2008)

Log Message:
-----------
Fix for misplaced objects in mouse object selection (Operation Stealth specific).
- Implemented Operation Stealth specific part of getObjectUnderCursor
  which handles negative frame values.
- Fixed a test case (Should test for ydif <= 0 although tested for ydif < 0).
- Made part-value be anded with 0x0F in a test case to comply with disassembly.
- Added comment about a test case which isn't present in the disassembly.
  Removing it makes things crash sometimes so letting it be.

Modified Paths:
--------------
    scummvm/trunk/engines/cine/various.cpp

Modified: scummvm/trunk/engines/cine/various.cpp
===================================================================
--- scummvm/trunk/engines/cine/various.cpp	2008-08-04 18:15:17 UTC (rev 33619)
+++ scummvm/trunk/engines/cine/various.cpp	2008-08-04 19:32:52 UTC (rev 33620)
@@ -189,6 +189,15 @@
 		frame = ABS((int16)(objectTable[it->objIdx].frame));
 		part = objectTable[it->objIdx].part;
 
+		// Additional case for negative frame values in Operation Stealth
+		if (g_cine->getGameType() == Cine::GType_OS && objectTable[it->objIdx].frame < 0) {
+			if ((it->type == 1) && (x >= objX) && (objX + frame >= x) && (y >= objY) && (objY + part >= y)) {
+				return it->objIdx;
+			} else {
+				continue;
+			}
+		}
+
 		if (it->type == 0) {
 			threshold = animDataTable[frame]._var1;
 		} else {
@@ -201,16 +210,19 @@
 		xdif = x - objX;
 		ydif = y - objY;
 
-		if ((xdif < 0) || ((threshold << 4) <= xdif) || (ydif < 0) || (ydif >= height) || !animDataTable[frame].data()) {
+		if ((xdif < 0) || ((threshold << 4) <= xdif) || (ydif <= 0) || (ydif >= height) || !animDataTable[frame].data()) {
 			continue;
 		}
 
 		if (g_cine->getGameType() == Cine::GType_OS) {
+			// This test isn't present in Operation Stealth's PC version's disassembly
+			// but removing it makes things crash sometimes (e.g. when selecting a verb
+			// and moving the mouse cursor around the floor in the airport's bathroom).
 			if (xdif >= width) {
 				continue;
 			}
 
-			if (it->type == 0 && animDataTable[frame].getColor(xdif, ydif) != part) {
+			if (it->type == 0 && animDataTable[frame].getColor(xdif, ydif) != (part & 0x0F)) {
 				return it->objIdx;
 			} else if (it->type == 1 && gfxGetBit(xdif, ydif, animDataTable[frame].data(), animDataTable[frame]._width * 4)) {
 				return it->objIdx;


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