void ssm_get_random_start_pos(vector *out, vector *start, matrix *orient, int ssm_index) { vector temp; ssm_info *s = &Ssm_info[ssm_index]; // get a random vector in the circle of the firing plane vm_vec_random_in_circle(&temp, start, orient, s->radius, 1); // offset it a bit vm_vec_scale_add(out, &temp, &orient->vec.fvec, s->offset); }
void ssm_get_random_start_pos(vec3d *out, vec3d *start, matrix *orient, size_t ssm_index) { vec3d temp; ssm_info *s = &Ssm_info[ssm_index]; float radius, offset; if (s->max_radius == -1.0f) radius = s->radius; else radius = frand_range(s->radius, s->max_radius); if (s->max_offset == -1.0f) offset = s->offset; else offset = frand_range(s->offset, s->max_offset); switch (s->shape) { case SSM_SHAPE_SPHERE: // get a random vector in a sphere around the target vm_vec_random_in_sphere(&temp, start, orient, radius, 1); break; case SSM_SHAPE_CIRCLE: // get a random vector in the circle of the firing plane vm_vec_random_in_circle(&temp, start, orient, radius, 1); break; case SSM_SHAPE_POINT: // boooring vm_vec_scale_add(&temp, start, &orient->vec.fvec, radius); break; default: Assertion(false, "Unknown shape '%d' in SSM type #" SIZE_T_ARG " ('%s'). This should not be possible; get a coder!\n", s->shape, ssm_index, s->name); break; } // offset it a bit vm_vec_scale_add(out, &temp, &orient->vec.fvec, offset); }