[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