====== Multiple return values ======
Some ACSUtils functions return multiple values (e.g. [[math#vector_math|vector math functions]], but also some non-math functions). ACS doesn't support returning multiple values from a function.
ACSUtils uses a convention to fake returning multiple values from a function. The convention is as follows: there are 8 global variables with names ''r1'' through ''r8''. If a function returns multiple values, it actually returns no value and writes the first "returned" value to ''r1'', the second one to ''r2'', and so on.
Here's an example, ''RotateVector'' returns X and Y:
RotateVector(x, y, angle);
int newX = r1;
int newY = r2;
You should retrieve the return values **as soon as possible**, or else they may get overwritten by other functions that return multiple values.
Don't do this:
SomeFunctionWithMultipleReturnValues(...);
SomeOtherFunction(r1);
int b = r2;
Because ''SomeOtherFunction'' may call functions that **overwrite ''r2''**! Instead, strictly follow this style:
SomeFunctionWithMultipleReturnValues(...);
int a = r1;
int b = r2;
SomeOtherFunction(a);
Another shortcoming is that ''r1''..''r8'' are declared ''raw'' in BCC to be able to accomodate any type of return value, and thus bypass [[strict typing]], even if it's enabled.
ParseFixed("1.0", 10);
int error = r1;
int result = r2; // no compiler error, despite assigning a fixed to int
But overwriting argument variables immediately after calling the function is valid:
RotateVector(x, y, angle);
x = r1;
y = r2;
An example of a function returning three values:
normalize3d(x, y, z);
int newX = r1;
int newY = r2;
int newZ = r3;