Useful Formulae
Warp-in points
Ordinary Objects
An ordinary object is any object that does not fall withing any of the other categories described below.
Let the 3D vectors \(p_d\) and \(p_s\) represent the object’s position and the warp’s origin, respectively; and \(\vec{v}\) the directional vector from \(p_s\) to \(p_d\). Let \(r\) be the object’s radius.
The object’s warp-in point is the vector \(p_s + \vec{v} - r\hat{v}\).
In other words, the warping ship arrives at a point between the starting position and the targets' position, at the edge of the targets' radius.
Large Objects
A large object is any Celestial (type category 2) with a radius of at least 90 kilometres (180 kilometres in diameter), except wrecks, planets, and suns.
Let \(x\), \(y\), and \(z\) represent the object’s coordinates. Let \(r\) be the object’s radius.
The object’s warp-in point is the vector \(\left(x + (r + 5000000)\cos{r} \\, y + 1.3r - 7500 \\, z - (r + 5000000)\sin{r} \\ \right).\)
Example
Suns
The warp-in point of a sun is determined by its radius.
Let \(r\) be the sun's radius.
The sun’s warp-in point is the vector \(\left((r + 100000)\cos{r} \\, 0.2r \\, -(r + 100000)\sin{r} \\ \right).\)
Example
Planets
The warp-in point of a planet is determined by the planet's ID, its location, and radius.
Let \(x\), \(y\), and \(z\) represent the planet's coordinates. Let \(r\) be the planet's radius, and \(p\) be the planet's ID.
The planet's warp-in point is the vector \(\left(x + d \sin{\theta}, y + \frac{1}{2} r \sin{j}, z - d \cos{\theta}\right)\) where:
The function \(mt(p)\) represents the first floating point number in range \([0,1)\) generated by a Mersenne Twister PRNG seeded with the planet's ID.
In Python, this is equivalent to random.Random(p).random()
. Implementations of Mersenne Twisters are widely available
for popular languages, but you need to be careful to match Python's, as not all implementations use the provided seed in
the same way.
Example
import org.apache.commons.math3.random.MersenneTwister
import kotlin.math.*
fun getPlanetWarpInPoint(planetId: Int, x: Double, y: Double, z: Double, radius: Double): Triple<Double, Double, Double> {
val j = (MersenneTwister(intArrayOf(planetId)).nextDouble() - 1) / 3
val theta = asin((x / abs(x)) * (z / (sqrt(x.pow(2) + z.pow(2))))) + j
val s = (20 * ((10 * log10(radius / 1000000) - 39) / 40).pow(20) + 0.5).coerceIn(0.5, 10.5)
val d = radius * (s + 1) + 1000000
return Triple(x + sin(theta) * d, y + radius * sin(j) / 2, z - cos(theta) * d)
}
import math
import random
def warpin(id, x, y, z, r):
j = (random.Random(id).random() - 1.0) / 3.0
t = math.asin(x / abs(x) * (z / math.sqrt(x**2 + z**2))) + j
s = 20.0 * (1.0 / 40.0 * (10 * math.log10(r / 10**6) - 39)) ** 20.0 + 1.0 / 2.0
s = max(0.5, min(s, 10.5))
d = r * (s + 1) + 1000000
return (x + d * math.sin(t), y + 1.0 / 2.0 * r * math.sin(j), z - d * math.cos(t))
Skillpoints needed per level
The skillpoints needed for a level depend on the skill rank.
\(y_{skillpoints} = 2^{2.5(x_{skilllevel}-1)} \cdot 250 \cdot r_{skillrank}\)
Skillpoints for common ranks
Rank | Level 1 | Level 2 | Level 3 | Level 4 | Level 5 |
---|---|---|---|---|---|
1 | 250 | 1.414 | 8000 | 45,254 | 256,000 |
2 | 500 | 2,828 | 16,000 | 90,509 | 512,000 |
3 | 750 | 4,242 | 24,000 | 135,764 | 768,000 |
4 | 1000 | 5,656 | 32,000 | 181,019 | 1,024,000 |
5 | 1250 | 7,071 | 40,000 | 226,274 | 1,280,000 |
6 | 1500 | 8,485 | 48,000 | 271,529 | 1,536,000 |
7 | 1750 | 9,899 | 56,000 | 316,784 | 1,792,000 |
8 | 2000 | 11,313 | 64,000 | 362,039 | 2,048,000 |
9 | 2250 | 12,727 | 72,000 | 407,293 | 2,304,000 |
10 | 2500 | 14,142 | 80,000 | 452,548 | 2,560,000 |
11 | 2750 | 15,556 | 88,000 | 497,803 | 2,816,000 |
12 | 3000 | 16,970 | 96,000 | 543,058 | 3,072,000 |
13 | 3250 | 18,384 | 104,000 | 588,312 | 3,328,000 |
14 | 3500 | 19,798 | 112,000 | 633,567 | 3,584,000 |
15 | 3750 | 21,213 | 120,000 | 678,822 | 3,840,000 |
16 | 4000 | 22,627 | 128,000 | 724,077 | 4,096,000 |
Skillpoints per minute
The skillpoints generated each minute depend on the primary \((a_{primary})\) and secondary attribute \((a_{secondary})\) of the skill.
Target lock time
The target lock time (\(t_{targetlock}\)) in seconds depends on the ship's scan resolution (\(s\)) and the target's signature radius (\(r\))
Alignment time
The ship alignment time (\(t_{align}\)) depends on the ship's inertia modifier (\(i\)) and the ships mass (\(m\))