====== 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;