DECORATE supports complex mathematical expressions as parameters for codepointers. (Unfortunately, expressions are not supported for the values of properties.) The expression may include standard operators (+, -, *, /, <<, >>, |, etc.), math functions, and certain actor properties (occasionally called “keywords” in the forums) to compare values with. A_JumpIf, in particular, is meant to be used with expressions, but they can be used for any numeric (integer or floating point) parameter. For example, using velx, vely, and velz in A_SpawnItemEx to preserve velocity, or using args as arguments to a call of ACS_Execute.
- abs(x) — returns the absolute value of x
- cos(x), sin(x) — trigonometry functions, x must be in degrees
- sqrt(x) — returns the square root of x
- random[identifier](min, max) — returns a random integer value between min and max
- random2[identifier](mask) — returns a random integer value between -mask and +mask. It is roughly equivalent to random(0, mask) - random(0, mask). If no mask is provided (random2()), the maximum value of 255 is used instead. Mask is used as a binary mask, e.g. if 9 is used, the random results can be [0, 1, 8, 9] - [0, 1, 8, 9], so it is advised to use as a mask values one less than a power of two, such as 1, 3, 7, 15, 31, 63, or 127.
- frandom[identifier](min, max) — returns a random floating point value between min and max
- pick[identifier](int, ...) - picks a number from the numbers placed in it. This can take an unlimited amount of parameters, i.e. pick(1, 4, 12, 16) will choose one of the four numbers. (development version only)
identifier is optional. Calls to a random function with an identifier do not interfere with the RNG for calls with a different identifier, which can be used to make the outcome of some events unaffected by others.
- ACS_ExecuteWithResult — runs a script and uses its return value.
- ACS_NamedExecuteWithResult — runs a named script and uses its return value.
- CallACS — shorter alias for ACS_NamedExecuteWithResult.
- CheckClass — checks an actor's class name, returning true if it matches the passed parameter. (development version only)
- IsPointerEqual — compares two actor pointers, returning true if they reference the same actor. (development version only)
There are a few variables you can use for dynamic data in DECORATE definitions. These are:
- Actor position and movement
- x — The actor's X position in the world.
- y — Same, but for Y.
- z — Same, but for Z.
- angle — Actor's angle, in degrees
- ceilingz — See GetActorCeilingZ
- floorz — See GetActorFloorZ
- pitch — The actor's pitch. (Presumably, in degrees, based on the above.)
- velx or momx — Actor's velocity along the absolute X axis. The "mom" names are (deprecated).
- vely or momy — Same, but for Y.
- velz or momz — Same, but for Z.
- Actor properties
- accuracy — The accuracy of the Actor.
- alpha — The Alpha value of the Actor.
- args — Arguments passed to the thing special; args through args are valid.
- damage — The actor's Damage.
- health — How much health the Actor has left.
- height — The actor's Height. (New from )
- mass — The actor's Mass.
- meleerange — The actor's MeleeRange. (New from )
- radius — The actor's Radius. (New from )
- reactiontime — The actor's ReactionTime. (New from )
- scaleX — The actor's horizontal scale. See A_SetScale.
- scaleY — The actor's vertical scale. See A_SetScale.
- score — The actor's score.
- special — ID of the special currently assigned to this actor.
- speed — The actor's Speed. (development version only)
- stamina — The stamina of the Actor.
- tid — The actor's TID.
- tidtohate — TID of the current assigned target. (see Thing_Hate.)
- User Variables — user variables are defined as "var int user_(name);" in actor properties.
- User Arrays — user arrays are defined as "var int user_(name)[(size)];" in actor properties.
- waterlevel — How "submerged" the actor is in a Transfer_Heights or 3D floor water pool:
- 0: Not submerged at all (e.g. standing on solid ground or on shallow TERRAIN-based water)
- 1: Less than half submerged ("ankle deep")
- 2: At least half submerged ("waist deep")
- 3: Entirely submerged (completely underwater)
See Projectile Trap