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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Tue Jul 20 23:22:39 CEST 2010


Revision: 51074
          http://scummvm.svn.sourceforge.net/scummvm/?rev=51074&view=rev
Author:   m_kiewitz
Date:     2010-07-20 21:22:39 +0000 (Tue, 20 Jul 2010)

Log Message:
-----------
SCI: some sci32 fixes

kOnMe, kLocal2Global, kGlobal2Local now hires capable, hotspots seem to work in lsl6 and sq6, although pressing on start in sq6 doesn't work yet, you need to click on the rightmost/bottom area

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel32.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/graphics/coordadjuster.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2010-07-20 20:20:44 UTC (rev 51073)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2010-07-20 21:22:39 UTC (rev 51074)
@@ -447,6 +447,7 @@
 
 //    version,         subId, function-mapping,                    signature,              workarounds
 static const SciKernelMapSubEntry kPalVary_subops[] = {
+    { SIG_SCI21,           0, MAP_CALL(PalVaryInit),               "ii(i)(i)(i)",          NULL },
     { SIG_SCIALL,          0, MAP_CALL(PalVaryInit),               "ii(i)(i)",             NULL },
     { SIG_SCIALL,          1, MAP_CALL(PalVaryReverse),            "(i)(i)(i)",            NULL },
     { SIG_SCIALL,          2, MAP_CALL(PalVaryGetCurrentStep),     "",                     NULL },
@@ -521,7 +522,8 @@
     // be something like ListAt instead... If we swap the two subops though,
     // Torin demo crashes complaining that it tried to send to a non-object,
     // therefore the semantics might be different here (signature was l[o0])
-    { SIG_SCI21,          18, MAP_CALL(StubNull),                  "li",                   NULL },
+	// In SQ6 object is passed right when skipping the intro
+    { SIG_SCI21,          18, MAP_CALL(StubNull),                  "l[io]",                NULL },
     { SIG_SCI21,          19, MAP_CALL(ListEachElementDo),         "li(.*)",               NULL },
     { SIG_SCI21,          20, MAP_CALL(ListFirstTrue),             "li(.*)",               NULL },
     { SIG_SCI21,          21, MAP_CALL(ListAllTrue),               "li(.*)",               NULL },

Modified: scummvm/trunk/engines/sci/engine/kernel32.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel32.cpp	2010-07-20 20:20:44 UTC (rev 51073)
+++ scummvm/trunk/engines/sci/engine/kernel32.cpp	2010-07-20 21:22:39 UTC (rev 51074)
@@ -861,8 +861,8 @@
 	// Get the object's plane
 	reg_t planeObject = readSelector(s->_segMan, targetObject, SELECTOR(plane));
 	if (!planeObject.isNull()) {
-		uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x));
-		uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y));
+		//uint16 itemX = readSelectorValue(s->_segMan, targetObject, SELECTOR(x));
+		//uint16 itemY = readSelectorValue(s->_segMan, targetObject, SELECTOR(y));
 		uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY));
 		uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX));
 		uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top));
@@ -872,12 +872,12 @@
 
 		// Adjust the bounding rectangle of the object by the object's
 		// actual X, Y coordinates
-		itemY = ((itemY * g_sci->_gfxScreen->getHeight()) / planeResY);
-		itemX = ((itemX * g_sci->_gfxScreen->getWidth()) / planeResX);
-		itemY += planeTop;
-		itemX += planeLeft;
+		nsRect.top = ((nsRect.top * g_sci->_gfxScreen->getHeight()) / planeResY);
+		nsRect.left = ((nsRect.left * g_sci->_gfxScreen->getWidth()) / planeResX);
+		nsRect.bottom = ((nsRect.bottom * g_sci->_gfxScreen->getHeight()) / planeResY);
+		nsRect.right = ((nsRect.right * g_sci->_gfxScreen->getWidth()) / planeResX);
 
-		nsRect.translate(itemX, itemY);
+		nsRect.translate(planeLeft, planeTop);
 	}
 
 	//warning("kIsOnMe: (%d, %d) on object %04x:%04x, parameter %d", argv[0].toUint16(), argv[1].toUint16(), PRINT_REG(argv[2]), argv[3].toUint16());

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2010-07-20 20:20:44 UTC (rev 51073)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2010-07-20 21:22:39 UTC (rev 51074)
@@ -426,6 +426,7 @@
     { GID_SQ4,            -1,   928,  0,           "Narrator", "startText",      -1, 1000, { FAKE,   1 } }, // sq4cd: method returns this to the caller
     { GID_SQ6,           100,     0,  0,                "SQ6", "init",           -1,    2, { FAKE,   0 } }, // called when the game starts
     { GID_SQ6,           100, 64950,  0,               "View", "handleEvent",    -1,    0, { FAKE,   0 } }, // called when pressing "Start game" in the main menu
+    { GID_SQ6,            -1, 64964,  0,              "DPath", "init",           -1,    1, { FAKE,   0 } }, // during the game
     SCI_WORKAROUNDENTRY_TERMINATOR
 };
 

Modified: scummvm/trunk/engines/sci/graphics/coordadjuster.cpp
===================================================================
--- scummvm/trunk/engines/sci/graphics/coordadjuster.cpp	2010-07-20 20:20:44 UTC (rev 51073)
+++ scummvm/trunk/engines/sci/graphics/coordadjuster.cpp	2010-07-20 21:22:39 UTC (rev 51074)
@@ -31,6 +31,7 @@
 #include "sci/engine/selector.h"
 #include "sci/graphics/coordadjuster.h"
 #include "sci/graphics/ports.h"
+#include "sci/graphics/screen.h"
 
 namespace Sci {
 
@@ -94,20 +95,36 @@
 }
 
 void GfxCoordAdjuster32::kernelGlobalToLocal(int16 &x, int16 &y, reg_t planeObject) {
-	//int16 resY = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resY));
-	//int16 resX = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resX));
-	//*x = ( *x * _screen->getWidth()) / resX;
-	//*y = ( *y * _screen->getHeight()) / resY;
-	x -= readSelectorValue(_segMan, planeObject, SELECTOR(left));
-	y -= readSelectorValue(_segMan, planeObject, SELECTOR(top));
+	EngineState *s = g_sci->getEngineState();
+	uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY));
+	uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX));
+	uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top));
+	uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left));
+
+	planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY;
+	planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX;
+
+	y -= planeTop;
+	x -= planeLeft;
+
+	y = ((y * planeResY) / g_sci->_gfxScreen->getHeight());
+	x = ((x * planeResX) / g_sci->_gfxScreen->getWidth());
 }
 void GfxCoordAdjuster32::kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject) {
-	//int16 resY = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resY));
-	//int16 resX = readSelectorValue(_s->_segMan, planeObj, SELECTOR(resX));
-	x += readSelectorValue(_segMan, planeObject, SELECTOR(left));
-	y += readSelectorValue(_segMan, planeObject, SELECTOR(top));
-	//*x = ( *x * resX) / _screen->getWidth();
-	//*y = ( *y * resY) / _screen->getHeight();
+	EngineState *s = g_sci->getEngineState();
+	uint16 planeResY = readSelectorValue(s->_segMan, planeObject, SELECTOR(resY));
+	uint16 planeResX = readSelectorValue(s->_segMan, planeObject, SELECTOR(resX));
+	uint16 planeTop = readSelectorValue(s->_segMan, planeObject, SELECTOR(top));
+	uint16 planeLeft = readSelectorValue(s->_segMan, planeObject, SELECTOR(left));
+
+	planeTop = (planeTop * g_sci->_gfxScreen->getHeight()) / planeResY;
+	planeLeft = (planeLeft * g_sci->_gfxScreen->getWidth()) / planeResX;
+
+	y = ((y * g_sci->_gfxScreen->getHeight()) / planeResY);
+	x = ((x * g_sci->_gfxScreen->getWidth()) / planeResX);
+
+	x += planeLeft;
+	y += planeTop;
 }
 
 Common::Rect GfxCoordAdjuster32::onControl(Common::Rect rect) {


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