aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/scumm/he/logic_he.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp
index 4ccc2ac5e8..371ea6b979 100644
--- a/engines/scumm/he/logic_he.cpp
+++ b/engines/scumm/he/logic_he.cpp
@@ -322,24 +322,32 @@ int32 LogicHErace::op_1130(int32 *args) {
}
int32 LogicHErace::op_1140(int32 *args) {
- double arg2 = -args[2] * args[2];
- double arg3 = -args[3] * args[3];
- double sq = sqrt(arg2 + arg3);
- double res;
-
- arg2 = arg2 / sq;
- arg3 = arg3 / sq;
-
- res = (args[0] - 2 * (arg2 * args[0] + arg3 * args[1]) * arg2) * 0.86956525;
-
- writeScummVar(108, (int32)res);
-
- res = args[1] - 2 * (arg2 * args[0] + arg3 * args[1]) * arg3;
-
- if (-args[3] * args[3] >= 0)
- res *= 0.83333331f;
-
- writeScummVar(109, (int32)res);
+ // This functions seems to perform some kind of projection: We project
+ // the vector (arg2,arg3) onto the vector (arg0,arg1), but also apply
+ // some kind of distortion factor ?!?
+ double x = args[2], y = args[3];
+
+ // We start by normalizing the vector described by arg2 and arg3.
+ // So compute its length and divide the x and y coordinates
+ const double sq = sqrt(x*x + y*y);
+ x /= sq;
+ y /= sq;
+
+ // Compute the scaler product of the vectors (arg0,arg1) and (x,y)
+ const double scalarProduct = x * args[0] + y * args[1];
+
+ // Finally compute the projection of (arg2,arg3) onto (arg0,arg1)
+ double projX = args[0] - 2 * scalarProduct * args[2];
+ double projY = args[1] - 2 * scalarProduct * args[3];
+
+ projX *= 0.86956525; // FIXME: Why is this here?
+
+ writeScummVar(108, (int32)projX);
+
+ if (args[3] >= 0) // FIXME: Why is this here?
+ projY *= 0.83333331f; // FIXME: This value looks like 5/6
+
+ writeScummVar(109, (int32)projY);
return 1;
}