9 float a = explosion_v * (explosion_v - target_v);
15 a /= explosion_v * explosion_v;
21vector explosion_calcpush(
vector explosion_v,
float explosion_m,
vector target_v,
float target_m,
float elasticity)
33 (1 + elasticity) * (explosion_m) / (target_m + explosion_m)
49 m = 1 / ((1 + 0) * speedfactor - 1);
50 vector v = explosion_calcpush(explosion_f * speedfactor, m, target_v, 1, 0);
53 LOG_INFOF(
"MASS: %f\nv: %v -> %v\nENERGY BEFORE == %f + %f = %f\nENERGY AFTER >= %f",
55 target_v, target_v + v,
56 target_v * target_v, m * explosion_f * speedfactor * explosion_f * speedfactor, target_v * target_v + m * explosion_f * speedfactor * explosion_f * speedfactor,
57 (target_v + v) * (target_v + v));
70 return v - (v * p) * p;
76 D = q*q/4.0 + p*p*p/27.0;
80 a = 1.0/3.0 * acos(-q/2.0 *
sqrt(-27.0/(p*p*p)));
81 u =
sqrt(-4.0/3.0 * p);
99 return (u >= v) ?
vec3(v, v, u) :
vec3(u, v, v);
107 return vec3(a, a, a);
117 q = (27*a*a*d - 9*a*b*c + 2*b*b*b);
119 v = (v - b *
'1 1 1') * (1.0 / (3.0 * a));
121 v +=
'1 0 -1' * (v.z - v.x);
138 if (preferred_align < 1 || preferred_align > 4)
141 for (
int j = 4; j > 1; --j)
147 if (own.(weaponentity).m_gunalign == j)
149 if (own.(weaponentity).m_gunalign == preferred_align)
150 taken |=
BIT(preferred_align);
153 if (!(taken &
BIT(preferred_align)))
154 return preferred_align;
155 if (!(taken &
BIT(j)))
159 return preferred_align;
169int W_GetGunAlignment(
entity player)
171 int gunalign =
STAT(GUNALIGN, player);
172 if (gunalign < 1 || gunalign > 4)
192 makevectors(
'0 360 0' * (0.75 + (counter - 0.5) / (total - 1)));
197 s *= (1 - bias) +
random() * bias;
212 makevectors(
'0 360 0' * ((0.25 * ((total + 1) % 2)) + (counter / (total - 1))));
218 s *= (1 - bias) +
random() * bias;
235 switch (spread_style)
242 return (must_normalize ?
normalize(v1) : v1);
248 sigma = spread * 0.89442719099991587855;
258 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
260 sigma = spread * 0.44721359549996;
268 return (must_normalize ?
normalize(v2) : v2);
270 sigma = spread * 0.44721359549996;
279 sigma = spread * 1.154700538379252;
289 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
291 sigma = spread * 1.095445115010332;
302 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
304 sigma = spread * 1.224744871391589;
315 return normalize(
dir + (v1 * dx + v2 * dy) * r * sigma);
317 error(
"g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff), 6 (quadratic falloff), 7 (stronger falloff)!");
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
vector cliptoplane(vector v, vector p)
vector solve_cubic_pq(float p, float q)
vector W_CalculateSpreadPattern(int pattern, float bias, int counter, int total)
int W_GunAlign(entity this, int preferred_align)
float explosion_calcpush_getmultiplier(vector explosion_v, vector target_v)
vector findperpendicular(vector v)
vector damage_explosion_calcpush(vector explosion_f, vector target_v, float speedfactor)
vector solve_cubic_abcd(float a, float b, float c, float d)
vector W_CalculateSpread(vector dir, float spread, int spread_style, bool must_normalize)
float autocvar_g_weaponspreadfactor
const float W_SPREAD_GAUSS_MAX_STDEV
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
ERASEABLE float gsl_ran_ugaussian()
Returns a Gaussian random variate, with mean zero and standard deviation sigma 1 From the GNU Scienti...
const int MAX_WEAPONSLOTS
entity weaponentities[MAX_WEAPONSLOTS]