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

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Sun Sep 5 15:51:47 CEST 2010


Revision: 52560
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52560&view=rev
Author:   m_kiewitz
Date:     2010-09-05 13:51:47 +0000 (Sun, 05 Sep 2010)

Log Message:
-----------
SCI: reuse kGetAngle from kDoAvoider

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

Modified: scummvm/trunk/engines/sci/engine/kmath.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmath.cpp	2010-09-05 12:55:15 UTC (rev 52559)
+++ scummvm/trunk/engines/sci/engine/kmath.cpp	2010-09-05 13:51:47 UTC (rev 52560)
@@ -72,30 +72,24 @@
 	return make_reg(0, (int16) sqrt((float) ABS(argv[0].toSint16())));
 }
 
-reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
-	// Based on behavior observed with a test program created with
-	// SCI Studio.
-	int x1 = argv[0].toSint16();
-	int y1 = argv[1].toSint16();
-	int x2 = argv[2].toSint16();
-	int y2 = argv[3].toSint16();
-	int xrel = x2 - x1;
-	int yrel = y1 - y2; // y-axis is mirrored.
-	int angle;
+uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2) {
+	int16 xRel = x2 - x1;
+	int16 yRel = y1 - y2; // y-axis is mirrored.
+	int16 angle;
 
 	// Move (xrel, yrel) to first quadrant.
 	if (y1 < y2)
-		yrel = -yrel;
+		yRel = -yRel;
 	if (x2 < x1)
-		xrel = -xrel;
+		xRel = -xRel;
 
 	// Compute angle in grads.
-	if (yrel == 0 && xrel == 0)
-		angle = 0;
+	if (yRel == 0 && xRel == 0)
+		return 0;
 	else
-		angle = 100 * xrel / (xrel + yrel);
+		angle = 100 * xRel / (xRel + yRel);
 
-	// Fix up angle for actual quadrant of (xrel, yrel).
+	// Fix up angle for actual quadrant of (xRel, yRel).
 	if (y1 < y2)
 		angle = 200 - angle;
 	if (x2 < x1)
@@ -105,8 +99,18 @@
 	// grad 10 with grad 11, grad 20 with grad 21, etc. This leads to
 	// "degrees" that equal either one or two grads.
 	angle -= (angle + 9) / 10;
+	return angle;
+}
 
-	return make_reg(0, angle);
+reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) {
+	// Based on behavior observed with a test program created with
+	// SCI Studio.
+	int x1 = argv[0].toSint16();
+	int y1 = argv[1].toSint16();
+	int x2 = argv[2].toSint16();
+	int y2 = argv[3].toSint16();
+
+	return make_reg(0, kGetAngleWorker(x1, y1, x2, y2));
 }
 
 reg_t kGetDistance(EngineState *s, int argc, reg_t *argv) {

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-09-05 12:55:15 UTC (rev 52559)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2010-09-05 13:51:47 UTC (rev 52560)
@@ -387,27 +387,8 @@
 }
 
 extern void kDirLoopWorker(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv);
+extern uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2);
 
-int getAngle(int xrel, int yrel) {
-	if ((xrel == 0) && (yrel == 0))
-		return 0;
-	else {
-		int val = (int)(180.0 / PI * atan2((double)xrel, (double) - yrel));
-		if (val < 0)
-			val += 360;
-
-		// Take care of OB1 differences between SSCI and
-		// FSCI. SCI games sometimes check for equality with
-		// "round" angles
-		if (val % 45 == 44)
-			val++;
-		else if (val % 45 == 1)
-			val--;
-
-		return val;
-	}
-}
-
 reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) {
 	SegManager *segMan = s->_segMan;
 	reg_t avoider = argv[0];
@@ -446,8 +427,7 @@
 			return SIGNAL_REG;
 		avoiderHeading = -1;
 
-		// TODO: reverse this
-		uint16 angle = getAngle(moverX - clientX, moverY - clientY);
+		uint16 angle = kGetAngleWorker(clientX, clientY, moverX, moverY);
 
 		reg_t clientLooper = readSelector(segMan, client, SELECTOR(looper));
 		if (clientLooper.isNull()) {


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