Vectors in the wurst standard library refer to the euclidean vector commonly represented as an arrow, connecting point A with point B. They are most commonly used to describe a position in 2d or 3d space, e.g. the position of a unit
unit.getPos() returns vec2 or target position on map
vec3 are tuples, meaning they have no object id and thus cannot be represented as a single integer. Vectors should be used instead of
location or raw primitives. The standard library provides most vector algebra out of the box.
// Create footman at (0, 0) let u = createUnit(DUMMY_PLAYER, UnitIds.footman, ZERO2, angle(0)) let pos = u.getPos() // Print a unit's position print(pos.toString()) // Move position right by 128 units u.setXY(pos + vec2(128, 0))
Addition, subtraction and scalar multiplocation are implemented via operator overloading (+, -, *).
let a = vec2(1, 1) let b = vec2(2, 2) let sum = a + b let difference = a - b let scalar = a * 0.5
distanceToSq to calculate the distance or squared distance between two vectors respectively. Squared distance is often used in range checks to compared with the squared range for a faster calculation (no square root).
let distSq = caster.getPos().distanceToSq(target.getPos()) if distSq < 256 * 256 // in range, deal damage caster.damageTarget(target, 32.)
Additionally you can calculate a vectors distance to a linesegment and whether it’s contained inside a triangle or polygon.
Polar Projection uses trigonometry to project a vector in 2d and 3d space using a distance and angles in which to project. Let’s look at the math real quick.
Given an angle in radians, the
Cos functions return the distance, on the y and x axis respectively, to the point on the outside of the unit circle at that angle. We know that the blue line is of length 1 because it is equal to the radius of the unit circle. Thus we can scale it to our desired distance simply by multiplying the x and y values, resulting in
vec2(Cos(this.radians) * len, Sin(this.radians) * len).
Remember that in warcraft 3 a zero xy-angle points east, and a zero z-angle points upwards.
// Blink caster a certain distance in the target direction let caster = GetSpellAbilityUnit() let target = getSpellTargetPos() let blinkPos = caster.getPos().polarOffset(caster.angleTo(target), BLINK_RANGE) flashEffect(Abilities.blink, blinkPos) caster.setPos(blinkPos)