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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sat Sep 4 00:15:09 CEST 2010


Revision: 52510
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52510&view=rev
Author:   m_kiewitz
Date:     2010-09-03 22:15:08 +0000 (Fri, 03 Sep 2010)

Log Message:
-----------
SCI: kDirLoop freshly reversed

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

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-09-03 19:13:58 UTC (rev 52509)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2010-09-03 22:15:08 UTC (rev 52510)
@@ -62,48 +62,43 @@
 	dialog.runModal();
 }
 
-void _k_dirloop(reg_t object, uint16 angle, EngineState *s, int argc, reg_t *argv) {
+void kDirLoopWorker(reg_t object, uint16 angle, EngineState *s, int argc, reg_t *argv) {
 	GuiResourceId viewId = readSelectorValue(s->_segMan, object, SELECTOR(view));
 	uint16 signal = readSelectorValue(s->_segMan, object, SELECTOR(signal));
-	int16 loopNo;
-	int16 maxLoops;
-	bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
 
 	if (signal & kSignalDoesntTurn)
 		return;
 
 	angle %= 360;
 
-	if (!oldScriptHeader) {
-		if (angle < 45)
-			loopNo = 3;
-		else if (angle < 136)
-			loopNo = 0;
-		else if (angle < 225)
-			loopNo = 2;
-		else if (angle < 316)
-			loopNo = 1;
-		else
-			loopNo = 3;
+	int16 useLoop = -1;
+	if (getSciVersion() > SCI_VERSION_0_EARLY) {
+		if ((angle > 315) || (angle < 45)) {
+			useLoop = 3;
+		} else if ((angle > 135) && (angle < 225)) {
+			useLoop = 2;
+		}
 	} else {
-		if (angle >= 330 || angle <= 30)
-			loopNo = 3;
-		else if (angle <= 150)
-			loopNo = 0;
-		else if (angle <= 210)
-			loopNo = 2;
-		else if (angle < 330)
-			loopNo = 1;
-		else loopNo = -1;
+		// SCI0EARLY
+		if ((angle > 330) || (angle < 30)) {
+			useLoop = 3;
+		} else if ((angle > 150) && (angle < 210)) {
+			useLoop = 2;
+		}
 	}
+	if (useLoop == -1) {
+		if (angle >= 180) {
+			useLoop = 1;
+		} else {
+			useLoop = 0;
+		}
+	} else {
+		int16 loopCount = g_sci->_gfxCache->kernelViewGetLoopCount(viewId);
+		if (loopCount < 4)
+			return;
+	}
 
-	maxLoops = g_sci->_gfxCache->kernelViewGetLoopCount(viewId);
-		
-
-	if ((loopNo > 1) && (maxLoops < 4))
-		return;
-
-	writeSelectorValue(s->_segMan, object, SELECTOR(loop), loopNo);
+	writeSelectorValue(s->_segMan, object, SELECTOR(loop), useLoop);
 }
 
 static reg_t kSetCursorSci0(EngineState *s, int argc, reg_t *argv) {
@@ -411,7 +406,7 @@
 }
 
 reg_t kDirLoop(EngineState *s, int argc, reg_t *argv) {
-	_k_dirloop(argv[0], argv[1].toUint16(), s, argc, argv);
+	kDirLoopWorker(argv[0], argv[1].toUint16(), s, argc, argv);
 
 	return s->r_acc;
 }

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-09-03 19:13:58 UTC (rev 52509)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-09-03 22:15:08 UTC (rev 52510)
@@ -376,7 +376,7 @@
 	return s->r_acc;
 }
 
-extern void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
+extern void kDirLoopWorker(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
 
 int getAngle(int xrel, int yrel) {
 	if ((xrel == 0) && (yrel == 0))
@@ -503,7 +503,7 @@
 			return s->r_acc;
 		} else {
 			// No looper? Fall back to DirLoop
-			_k_dirloop(client, (uint16)angle, s, argc, argv);
+			kDirLoopWorker(client, (uint16)angle, s, argc, argv);
 		}
 	}
 


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