diff options
-rw-r--r-- | engines/sci/engine/kmath.cpp | 38 | ||||
-rw-r--r-- | engines/sci/engine/kmovement.cpp | 24 |
2 files changed, 23 insertions, 39 deletions
diff --git a/engines/sci/engine/kmath.cpp b/engines/sci/engine/kmath.cpp index 4e5d8f083d..792181b832 100644 --- a/engines/sci/engine/kmath.cpp +++ b/engines/sci/engine/kmath.cpp @@ -72,30 +72,24 @@ reg_t kSqrt(EngineState *s, int argc, reg_t *argv) { 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 @@ reg_t kGetAngle(EngineState *s, int argc, reg_t *argv) { // 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; +} + +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, angle); + return make_reg(0, kGetAngleWorker(x1, y1, x2, y2)); } reg_t kGetDistance(EngineState *s, int argc, reg_t *argv) { diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index fe8b4e4da3..db54705694 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -387,26 +387,7 @@ reg_t kDoBresen(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)) - 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; - } -} +extern uint16 kGetAngleWorker(int16 x1, int16 y1, int16 x2, int16 y2); reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { SegManager *segMan = s->_segMan; @@ -446,8 +427,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { 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()) { |